1. 程式人生 > >QT 信號和槽鏈接時註意事項

QT 信號和槽鏈接時註意事項

發出 事件循環 產生 csocket 方式 on() 繼承 關系 父類

1、需要繼承Qobject 。

2、需要有Q_OBJECT宏。

3、如果有多重的繼承關系,則每個子類都需要單獨寫Q_OBJECT宏,不能因為父類有Q_OBJECT宏就省略。

4、繼承Qobject的類的聲明必須在.h文件中,否則無法產生moc文件,信號和槽的鏈接就不起作用。

1 class myClass : public QObject
2 {
3     Q_OBJECT
4 public:
5     myClass(){}
6 }

5、信號和槽的鏈接用 connect函數。

//!舊鏈接方式 編譯時不檢查(對象,槽,信號)存在與否,不做隱式轉換,錯誤只能再運行時發現。
connect( &mTcpServer, SIGNAL(newConnection()), pIoIntf, SLOT(test()) );

//!新鏈接方式 編譯時會檢查,參數會做隱式轉換。 QObject::connect( &mTcpServer, &QTcpServer::newConnection, pIoIntf, &CSocketInterface::test );

6、connect的第五個參數有以下幾個選項,這裏對五個參數的說明參考的 http://blog.chinaunix.net/uid-24219701-id-4042043.html 的帖子。

特別註意的是:平時使用connect函數,如果不指定第五個參數,則默認是Qt::AutoConnection, 一定要檢查發射信號的對象與槽函數所在的對象是否在同一個線程。

1、如果在同一個線程,則默認是直接調用的方式,一般沒什麽問題。

2、如果不在同一個線程,則默認使用隊列異步調用的方式,如果兩個線程都不會被挪動,那一般也沒什麽問題。

3、如果不在同一個線程,且這兩個線程在程序運行期間會被挪動,那就會出現信號發送出去,槽函數沒反應的現象,而且一般還不太好找原因, 如果出現這種問題,可視情況指定Qt::DirectConnection參數,采用直接調用的方式解決。

Qt::DirectConnection         //直接連接意味著槽函數將在信號發出的線程直接調用
Qt::QueuedConnection //隊列連接意味著向接受者所在線程發送一個事件,該線程的事件循環將獲得這個事件,然後之後的某個時刻調用槽函數 Qt::BlockingQueuedConnection //阻塞的隊列連接就像隊列連接,但是發送者線程將會阻塞,直到接受者所在線程的事件循環獲得這個事件,槽函數被調用之後,函數才會返回 Qt::AutoConnection //自動連接(默認)意味著如果接受者所在線程就是當前線程,則使用直接連接;否則將使用隊列連接

QT 信號和槽鏈接時註意事項