Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将信号连接到具有恒定值的插槽_C++_Qt_Qt4_Signals Slots - Fatal编程技术网

C++ 将信号连接到具有恒定值的插槽

C++ 将信号连接到具有恒定值的插槽,c++,qt,qt4,signals-slots,C++,Qt,Qt4,Signals Slots,要将信号连接到插槽,据我所知,信号的参数需要与插槽的参数匹配。例如: connect(dockWidget->titleBarWidget(), SIGNAL(closeButtonClicked()), ui->sideControls, SLOT(closeDockWidget())); 但是,如果我想让一个信号调用一个具有不同数量参数的插槽,但总是向插槽传递一个常量值,该怎么办呢。例如,使用上述代码: connect(dockWidget->titleBarWidget

要将信号连接到插槽,据我所知,信号的参数需要与插槽的参数匹配。例如:

connect(dockWidget->titleBarWidget(), SIGNAL(closeButtonClicked()), ui->sideControls, SLOT(closeDockWidget()));
但是,如果我想让一个信号调用一个具有不同数量参数的插槽,但总是向插槽传递一个常量值,该怎么办呢。例如,使用上述代码:

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

或者换句话说,只要按下按钮,它就会调用带有false参数的
setDockWidget()
函数。这可能吗?不,不可能。仅允许连接参数计数小于或等于相应信号中参数计数的插槽。(见附件)


您必须创建代理插槽,该插槽将调用所需的插槽。

在某种程度上,是的,您可以。但是它不是很强大:只需通过以下方式声明
setDockWidget

[virtual] void setDockWidget(bool state=false) ;
connect(emitter, SIGNAL(closeButtonClicked()), receiver, SLOT(setDockWidget()));
并按以下方式声明连接:

[virtual] void setDockWidget(bool state=false) ;
connect(emitter, SIGNAL(closeButtonClicked()), receiver, SLOT(setDockWidget()));

无参数调用setDockWidget将采用默认参数。

您可以将lambda与所需调用一起使用常量参数一起使用。例如:

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

有关新连接语法的更多信息:。

在您的情况下,是否可以将常量参数与变量混合使用?@AlekseyKontsevich:如果我理解正确,您还想将变量从信号传递到插槽?当然可以。将其作为lambda的参数,并在函数调用中使用该参数。但是,我建议您也将上下文参数与值“this”一起使用。这样,如果接收对象被破坏,您可以确保连接被破坏。否则,您可能会出现未定义的行为。这个答案不再真正有效,因为C++11上的Qt5语法使使用lambda实现此目的变得非常容易。@安德烈,另一方面,您可以
创建代理插槽,该插槽将调用所需的插槽。
现在,确实可以。但是一个额外的槽意味着在你的头中有更多你不想要的东西,暴露于外部调用(是的,即使可以从外部调用一个私有槽),并在多个位置上传播你的代码。您甚至可能需要额外的成员变量来包含要传递的值,从而在类中引入额外的状态。lambda解决方案非常优雅,它取消了引入代理插槽作为解决方案的资格。