QT学习笔记-01
这是我学习Qt的笔记,讲的应该不会太仔细。
第一件事都是HelloWorld,
so,新建一个Apllication程序,选择Qt Widgets Application,(我看的教程是选择Qt Gui application,反正是创建QT桌面程序)
1 #include "mainwindow.h" 2 #include <QApplication> 3 #include <qlabel.h> 4 5 int main(int argc, char *argv[]) 6 { 7 QApplication a(argc, argv); 8 //MainWindow w; 9 //w.show(); 10 QLabel la("Hello world"); 11 la.show(); 12 13 return a.exec(); 14 }
点绿色箭头后,跑出来这么一个界面,算成功了?!
//---------------------------------------------------------------
信号槽
所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,用自己的一个函数(成为槽(slot))来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。这就类似观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发。
上面这句是文档里的内容,感觉还算容易理解,就不自己构思怎么描述了。
按钮 Qt 中被称为QPushButton

1 #include "mainwindow.h" 2 #include <QApplication> 3 #include <qlabel.h> 4 #include <qpushbutton.h> 5 6 int main(int argc, char *argv[]) 7 { 8 QApplication a(argc, argv); 9 //MainWindow w; 10 //w.show(); 11 QLabel la("Hello world"); 12 la.show(); 13 QPushButton button("Quit"); 14 QObject::connect(&button, &QPushButton::clicked, &QApplication::quit); 15 button.show(); 16 17 return a.exec(); 18 }
这里跑出来的结果并不是我期望的先有一个Helloworld,后面跟一个按钮,而是只看到一个按钮,恩,后面需要弄清楚是怎么回事。
QObject::connect()
有五个重载:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
QMetaObject::Connection connect(const QObject *, const char *,
const QObject *, const char *,
Qt::ConnectionType);
QMetaObject::Connection connect(const QObject *, const QMetaMethod &,
const QObject *, const QMetaMethod &,
Qt::ConnectionType);
QMetaObject::Connection connect(const QObject *, const char *,
const char *,
Qt::ConnectionType) const;
QMetaObject::Connection connect(const QObject *, PointerToMemberFunction,
const QObject *, PointerToMemberFunction,
Qt::ConnectionType)
QMetaObject::Connection connect(const QObject *, PointerToMemberFunction,
Functor);
|
第一个,sender 类型是const QObject *
,signal 的类型是const char *
,receiver 类型是const QObject *
,slot 类型是const char *
。这个函数将 signal 和 slot 作为字符串处理。
第二个,sender 和 receiver 同样是const QObject *
,但是 signal 和 slot 都是const QMetaMethod &
。我们可以将每个函数看做是QMetaMethod
的子类。因此,这种写法可以使用QMetaMethod
进行类型比对。
第三个,sender 同样是const QObject *
,signal 和 slot 同样是const char *
,但是却缺少了 receiver。这个函数其实是将 this 指针作为 receiver。
第四个,sender 和 receiver 也都存在,都是const QObject *
,但是 signal 和 slot 类型则是PointerToMemberFunction
。看这个名字就应该知道,这是指向成员函数的指针。
第五个,前面两个参数没有什么不同,最后一个参数是Functor
类型。这个类型可以接受 static 函数、全局函数以及 Lambda 表达式。
上面这段也算是摘抄,因为短时间内还是似懂非懂的状态,没办法用自己的话来说。
凡是继承了QObject的类才有信号槽功能,凡是QObject类(不管是直接子类还是间接子类),都应该在第一行代码写上Q_OBJECT
。
这个宏的展开将为我们的类提供信号槽机制、国际化机制以及 Qt 提供的不基于 C++ RTTI 的反射能力。
一加上Q_OBJECT
就出错,很大一部分是因为没有注意到这个宏应该放在头文件中。如果类放在cpp文件中,会出错没有办法进行moc,把类放到头文件里就可以了。
自定义信号槽需要注意的事项:
- 发送者和接收者都需要是
QObject
的子类(当然,槽函数是全局函数、Lambda 表达式等无需接收者的时候除外); - 使用 signals 标记信号函数,信号是一个函数声明,返回 void,不需要实现函数代码;
- 槽函数是普通的成员函数,作为成员函数,会受到 public、private、protected 的影响;
- 使用 emit 在恰当的位置发送信号;
- 使用
QObject::connect()
函数连接信号和槽。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)