目录
1.信号槽机制
QT的信号槽类似观察者模式,比如按钮被点击后会发出一个信号,如果有对象想接受这个信号,就会使用connect函数进行链接。当信号发出时,被连接的槽函数会被自动回调。
connect:
connect函数最常用的一般形式:connect(sender,signal,receiver,slot);
- sender:发出信号的对象
- signal:发送对象发出的信号
- receiver:接收信号的对象
- slot:接收对象在接收到信号之后所需要调用的函数
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
Signal signal;
Slot slot;
// 建立信号和槽的连接
QObject::connect(&signal, &Signal::mySignal, &slot, &Slot::mySlot);
// 发出信号
signal.mySignal();
return app.exec();
}
2.自定义信号槽
在这段代码中,我们定义了一个名为
MyWidget
的自定义控件,其中包含了一个自定义的信号mySignal
和一个与之对应的槽函数mySlot
。当mySignal
被发出时,mySlot
将会被调用并输出一条消息到控制台。
#include <QObject>
#include <QDebug>
class MyWidget : public QWidget {
Q_OBJECT
public:
MyWidget(QWidget *parent = nullptr) : QWidget(parent) {
// 连接信号和槽函数
connect(this, &MyWidget::mySignal, this, &MyWidget::mySlot);
}
public slots:
void mySlot() {
qDebug() << "My widget slot function called!";
}
signals:
void mySignal();
};
自定义信号槽的注意事项
- 发送者和接收者都需要是QObject 的子类(当然,槽函数是全局函数、Lambda表达式等无需接收者的时候除外);
- 使用signals标记信号函数,信号是一个函数声明,返回void,不需要实现函数代码;
- 槽函数是普通的成员函数,作为成员函数,会受到public、private.protected 的影响;
- 使用emit在恰当的位置发送信号;
- 使用QObject:connect()函数连接信号和槽。
- 任何成员函数、static函数、全局函数和Lambda表达式都可以作为槽函数
信号槽的用法:
- 一个信号可以和多个槽连接(会被逐一调用,但是调用顺序不确定)
- 多个信号连接到一个槽(任意信号发出,槽就会被调用)
- 一个信号可以连接到另一个信号(第一个信号发出后第二个信号被发出)
- 槽可以被取消连接(当一个对象被delete后,自动取消所有连接到这个对象上的槽)
- 在连接信号和槽的时候,槽函数可以使用Lambda表达式的方式进行处理
3.Lambda表达式:
C++11中Lambda表达式用于定义并创建匿名的函数对象简化编程工作。
组成:[函数对象参数](操作符重载函数参数)mutable或exception ->返回值{函数体}
[]表示lambda的开始,是必须存在的。
[ ]的对象参数形式:
- 空:没有任何函数对象参数
- =:可以使用Lambda所在作用范围内所有可见的局部变量。采用了值传递方式
- &:可以使用Lambda所在作用范围内所有可见的局部变量。采用了引用传递方式
- this:可以使用Lambda所在类的成员变量
- &a:按引用传递传a
- a,&b:a值传递,b引用传递
操作符重载函数参数:
标识重载的()操作符的参数,无参时可以省略,参数可以通过按值和引用两种方式传递。
函数返回值 :
->返回值类型,标识函数返回值的类型,当返回值为void,或者函数体中只有一处return 的地方(此时编译器可以自动推断出返回值类型)时,这部分可以省略。
函数体:
{}辨识函数的实现,不可以省略,但是函数体可以为空。
connect(clearButton, &QPushButton::clicked, [=]() {
nameCheckBox->setChecked(false);
RFIDCheckBox->setChecked(false);
statusCheckBox->setChecked(false);
typeCheckBox->setChecked(false);
nameFilterLineEdit->clear();
RFIDFilterLineEdit->clear();
});
代码中就是连接了一个按钮的点击信号到一个Lambda函数。当点击按钮时,这个函数将会执行{}内的操作。
4.快捷键
Creator模式的快捷键包括:
- F1 键的作用是打开帮助文档,如果在函数名字或类名上按 F1,则可跳转到对应帮助文档。查看其详细用法。
- F2:跳转到函数定义。
- Shift+F2:在函数声明和定义之间切换。
- F4:在头文件和源文件之间切换。
- Ctrl+Space:自动补全。
- Ctrl+R:运行工程。
- Ctrl+I:自动对齐。
- Ctrl+/:注释行或取消注释行。
- Ctrl+Shift+<:折叠代码块。
- Ctrl+Shift+>:展开代码块。
- Ctrl+[:跳到代码块的头部。
- Ctrl+):跳到代码块的尾部。
- Ctrl+L:跳到某一行。
- Ctrl+F:查找替换当前选中的内容,按下Ctrl+F,会列出所有和你选的内容一样的语句。
- Ctrl+Shift+F:查找内容。
- F5:开始调试。
- Shift+F5:停止调试。
- F9:设置和取消断点。
- F10:单步前进。
- F11:单步进入函数。
- Shift + F11:单步跳出函数。