天天看點

QT 之 編譯錯誤總結(1)

1.'Thread' does not name a type

錯誤在于:頭檔案互相包含

2. QTcpSocket不能跨線程通路

比如說我在子線程的構造函數對其成員QTcpSocket進行了執行個體化,然後在其run()函數中進行操作;

運作時一般會出現如下資訊:

QObject: Cannot create children for a parent that is in a different thread.

(Parent is QNativeSocketEngine(0xadc00df0), parent*s thread is QThread(0x81c0298), current thread is QThread(0x806e000)

如果在構造函數中執行個體化了QTcpSocket,則該對象将屬于調用該子線程的對象而非子線程本身;

解決: 不要在構造函數中執行個體化,而是在子線程的run()函數中執行個體化并操作,這樣才屬于子線程本身。

3.不能跨線程調用Q_OBJECT

運作時出現如下資訊:

QSocketNotifier: socket notifiers cannot be enabled from another thread.

原因在于不能跨線程調用Q_OBJECT,隻要使用了信号槽機制就不能跨線程通路;

注意QT中界面線程是主線程,其他建立的QThread,隻要使用了Q_OBJECT,就不能跨線程通路。

這裡延伸出一個問題:

如果不使用Qt的信号槽機制,能跨線程通路嗎?當然是可以的。

但QTcpSocket步行,原因在于QTcpSocket本身就使用了信号槽機制。

4.錯誤:QApplication: Object event filter cannot be in a different thread.

不要在子線程中處理UI,官網警告過

Qt

繼續閱讀