QT 訊號槽機制
所有從 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
都被執行)。