1. 程式人生 > 其它 >QT 訊號槽機制

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第五個引數

  如果是在同一執行緒裡面的操作(signalslot都在同一個執行緒),那麼用Qt::DirectConnection的效率最高(使用預設值Qt::AutoConnection也OK),主要是Qt::DirectConnectionQt::QueuedConnection都需要儲存到佇列。

  如果是多個執行緒之間進行訊息傳遞(signalslot都在不同執行緒),那麼就要用到Qt::QueuedConnection或者Qt::BlockingQueuedConnection,不過一個是無阻塞的(Qt::QueuedConnection),一個是阻塞的(Qt::BlockingQueuedConnection

,傳送訊息後會阻塞,直到所有的slot都被執行)。