文章目录
1.信号与槽简介
概述
一句话概括:对象与对象之间通信,一个对象发送信号,另一个对象用槽接收信号,接收信号实现的动作就是槽函数。
摘自官方文档
https://doc.qt.io/qt-6/signalsandslots.html
2.信号与槽原理
moc
程序编译时make调用MOC对工程源码进行解析,生成相应类的moc_xxx.cpp文件。
调用原理
信号与槽特点
- 一个信号可以连接多个槽
- 多个信号可以连接同一个槽
- 信号与信号可以相互连接
- 连接可以被移除
- 信号可以被移除
3.信号与槽API
connect函数
//sender:发送者对象
//signal:发送者的信号
//receiver:接受者对象
//method:接受者槽函数
//type:信号连接方式
QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
信号连接方式参数
- Qt::AutoConnection0(Default):如果接收器位于发出信号的线程中,则使用 Qt::DirectConnection。 否则,使用 Qt::QueuedConnection。 连接类型在信号发出时确定。
- Qt::DirectConnection:发出信号时立即调用插槽。 该槽在信令线程中执行。
- Qt::QueuedConnection:当控制返回到接收者线程的事件循环时调用该槽。 插槽在接收者的线程中执行。
- Qt::BlockingQueuedConnection:与 Qt::QueuedConnection 相同,只是信号线程阻塞直到槽返回。 如果接收者位于信号线程中,则不得使用此连接,否则应用程序将死锁。
- Qt::UniqueConnection:这是一个可以使用按位 OR 与上述任何一种连接类型组合的标志。 当设置了 Qt::UniqueConnection 时,如果连接已经存在(即,如果相同的信号已经连接到同一对对象的同一插槽),则 QObject::connect() 将失败。 这个标志是在 Qt 4.6 中引入的。
- Qt::SingleShotConnection:这是一个可以使用按位 OR 与上述任何一种连接类型组合的标志。 当设置了 Qt::SingleShotConnection 时,槽只会被调用一次; 发出信号时,连接将自动断开。 这个标志是在 Qt 6.0 中引入的。
4.信号与槽实例
QLabel *label = new QLabel;
QLineEdit *lineEdit = new QLineEdit;
QObject::connect(lineEdit, &QLineEdit::textChanged,
label, &QLabel::setText);
QByteArray page = ...;
QTcpSocket *socket = new QTcpSocket;
socket->connectToHost("qt-project.org", 80);
QObject::connect(socket, &QTcpSocket::connected, [=] () {
socket->write("GET " + page + "\r\n");
});
connect(lineEdit, &QLineEdit::textChanged,this, &QMainWindow::sendMsg);