2013-12-18 42 views
1

我是qt的新手,我有一個問題。傳遞qt中的信號和插槽參數

我想連接信號和插槽。

QObject::connect(_Requests, SIGNAL(newJobsAvailable(const MyClass &)), _Object, SLOT(doSend(const MyClass &))); 

Qt的抱怨不能夠排隊MyClass

我怎樣

qRegisterMetaType<const MyClass &>("const MyClass&"); 
+0

的建議,你應該發送一個明確的指針,而不是一個const參考,以符合Qt的標準 –

+0

棘輪發飆:不知道你是什麼意思。通過指針傳遞值類型參數絕對是一個壞主意,而const refs。工作得很好(在大多數情況下是最好的選擇)。 –

+1

這不是問題,但是以實例(編譯器及其庫)保留以大寫字母('_Requests','_Object')開頭的名稱和包含兩個連續下劃線的名稱。不要使用它們。 –

回答

1

正確聲明,如果Qt的抱怨不能夠排隊你這個類意味着,Qt無法複製並放入課程的QVariant對象中。
這隻意味着只有直接連接才能工作。這是什麼意思?如果您在connect中使用最後一個參數的默認值,那麼線程之間的連接將不起作用! 將connect的最後一個參數設置爲Qt::DirectConnection應使該警告靜音,並且值Qt::QueuedConnection根本不起作用。

解決它的另一種方法是註冊您的類型。但是你應該沒有任何限定條件就這樣做!

qRegisterMetaType<MyClass>("MyClass"); 

如果您正在使用QT5然後考慮MyClass使用Q_GADGET宏(只是把它放在類定義的開始,並添加標題以親文件頭)。

+0

您應該添加Q_DECLARE_METATYPE()也需要 –

+0

否。使用這個'qRegisterMetaType'版本不是必需的。沒有typeName參數請求者的版本Q_DECLARE_METATYPE。請參閱[doc](http://qt-project.org/doc/qt-4.8/qmetatype.html#qRegisterMetaType)。 –

0

你需要確保MyClass具有公共默認和拷貝構造函數。因爲可能會複製該對象,即使您使用const ref聲明瞭信號和插槽。

如果出於某些原因複製是不可能的,然後通過指針由棘輪