2012-03-25 80 views
12

爲了將信號連接到插槽,據我所知,信號的參數需要與插槽的參數相匹配。因此,例如:將信號連接到固定值的插槽

connect(dockWidget->titleBarWidget(), SIGNAL(closeButtonClicked()), ui->sideControls, SLOT(closeDockWidget())); 

但是,如果我想有一個信號呼叫具有不同量的參數的插槽,但總是傳遞一個恆定值插入插槽什麼。例如,使用上面的代碼段:

connect(dockWidget->titleBarWidget(), SIGNAL(closeButtonClicked()), ui->sideControls, SLOT(setDockWidget(false))); 

或者換言之,每當按下該按鈕時,它調用setDockWidget()函數與假參數。這可能嗎?

回答

8

不,這是不可能的。只允許連接少於或等於參數計數的插槽,而不是相應的信號。 (請參見documentation

您必須創建代理插槽,它將調用所需的代理插槽。

+1

這個答案不再有效,因爲C++ 11上的Qt5語法使得爲此目的使用lambda非常容易。 – 2016-06-08 10:36:38

+1

@安德烈,另一方面,你可以'創建代理插槽,這將調用所需的一個.'現在到位 – Lol4t0 2016-06-08 15:04:03

+1

當然,你可以。但額外的插槽意味着您不想要的頭部中有更多東西,暴露於外部調用(是的,即使專用插槽可以從外部調用)並將代碼分散到多個位置。你甚至可能需要額外的成員變量來包含你想傳遞的值,從而在你的類中引入額外的狀態。 lambda解決方案非常優雅,因此它將代理插槽的引入視爲IMO的解決方案。 – 2016-06-08 18:51:37

6

某種程度上,是的,你可以。但是,這不是很強大:只要聲明setDockWidget這樣:

[virtual] void setDockWidget(bool state=false) ; 

,並宣佈該連接是這樣的:

connect(emitter, SIGNAL(closeButtonClicked()), receiver, SLOT(setDockWidget())); 

setDockWidget不帶參數調用採取默認的。

8

你可以使用拉姆達與所需呼叫常變量。示例:

connect(obj, &ObjType::signalName, [this]() { desiredCall(constantArgument); }); 

有關新連接語法的更多信息:https://wiki.qt.io/New_Signal_Slot_Syntax

+0

在你的情況是否可以混合常量參數與變量? – 2016-05-05 22:05:55

+0

@AlekseyKontsevich:如果我正確地理解了你,你想將信號中的變量傳遞給插槽?你當然可以。將它作爲lambda的參數並在函數調用中使用該參數。不過,我建議你使用值爲'this'的上下文參數。這樣,如果接收對象被破壞,則可以確定連接被破壞。否則,你可能會以未定義的行爲結束。 – 2016-06-08 10:35:11