我是qt的新手,我有一個問題。傳遞qt中的信號和插槽參數
我想連接信號和插槽。
QObject::connect(_Requests, SIGNAL(newJobsAvailable(const MyClass &)), _Object, SLOT(doSend(const MyClass &)));
Qt的抱怨不能夠排隊MyClass
等
我怎樣
qRegisterMetaType<const MyClass &>("const MyClass&");
我是qt的新手,我有一個問題。傳遞qt中的信號和插槽參數
我想連接信號和插槽。
QObject::connect(_Requests, SIGNAL(newJobsAvailable(const MyClass &)), _Object, SLOT(doSend(const MyClass &)));
Qt的抱怨不能夠排隊MyClass
等
我怎樣
qRegisterMetaType<const MyClass &>("const MyClass&");
正確聲明,如果Qt的抱怨不能夠排隊你這個類意味着,Qt無法複製並放入課程的QVariant對象中。
這隻意味着只有直接連接才能工作。這是什麼意思?如果您在connect
中使用最後一個參數的默認值,那麼線程之間的連接將不起作用! 將connect
的最後一個參數設置爲Qt::DirectConnection
應使該警告靜音,並且值Qt::QueuedConnection
根本不起作用。
解決它的另一種方法是註冊您的類型。但是你應該沒有任何限定條件就這樣做!
qRegisterMetaType<MyClass>("MyClass");
如果您正在使用QT5然後考慮MyClass
使用Q_GADGET宏(只是把它放在類定義的開始,並添加標題以親文件頭)。
您應該添加Q_DECLARE_METATYPE()也需要 –
否。使用這個'qRegisterMetaType'版本不是必需的。沒有typeName參數請求者的版本Q_DECLARE_METATYPE。請參閱[doc](http://qt-project.org/doc/qt-4.8/qmetatype.html#qRegisterMetaType)。 –
你需要確保MyClass
具有公共默認和拷貝構造函數。因爲可能會複製該對象,即使您使用const ref
聲明瞭信號和插槽。
如果出於某些原因複製是不可能的,然後通過指針由棘輪
的建議,你應該發送一個明確的指針,而不是一個const參考,以符合Qt的標準 –
棘輪發飆:不知道你是什麼意思。通過指針傳遞值類型參數絕對是一個壞主意,而const refs。工作得很好(在大多數情況下是最好的選擇)。 –
這不是問題,但是以實例(編譯器及其庫)保留以大寫字母('_Requests','_Object')開頭的名稱和包含兩個連續下劃線的名稱。不要使用它們。 –