2012-03-25 96 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