所有从 QObject 或其子类 ( 例如 Qwidget) 派生的类都能够包含信号和槽
(使用情况:类需要继承自QObject,并且在类的开头声明Q_OBJECT宏)
QT信号槽->类似于观察者模式
在信号被发送出来以后,会有对其感兴趣得槽去connect。槽函数自动触发。
QT自带得槽函数:
按钮等控件有自带得signals,从帮助文档中即可查看。例如:QPushButton::clicked
自定义信号槽:
注意使用条件。
1.自定义一个信号
class{
siganls:
void xxxx(); // 可以带参
}
2.自定义一个槽函数
3.connect 链接
4.emit 信号
关于connect的书写格式(QT5--c++11)
QObject::connect(&newspaper,
static_cast<void (Newspaper:: *)(const QString &, const QDate &)>(&Newspaper::newPaper),
&reader,
&Reader::receiveNewspaper); // 红体字部分是信号带参的参数类型,这种写法可以有效解决QT5信号槽有重载的情况
关于connect第五个参数
如果是在同一线程
里面的操作(signal
和slot
都在同一个线程),那么用Qt::DirectConnection
的效率最高(使用默认值Qt::AutoConnection
也OK),主要是Qt::DirectConnection
和Qt::QueuedConnection
都需要储存到队列。
如果是多个线程之间
进行消息传递(signal
和slot
都在不同线程),那么就要用到Qt::QueuedConnection
或者Qt::BlockingQueuedConnection
,不过一个是无阻塞的(Qt::QueuedConnection
),一个是阻塞的(Qt::BlockingQueuedConnection
,发送消息后会阻塞,直到所有的slot
都被执行)。