将信号连接到具有常量值的槽。

15

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

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

但是如果我想要一个信号调用一个参数数量不同的槽,但总是将一个常量值传递到槽中呢?例如,使用上面的代码片段:

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

换句话说,每当按钮被按下时,它都会使用false参数调用setDockWidget()函数。这个可能吗?

3个回答

18

你可以在所需调用恒定参数中使用lambda。例如:

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

更多关于新连接语法的信息:https://wiki.qt.io/New_Signal_Slot_Syntax


在您的情况下,是否可以将常量参数与变量混合使用? - Aleksey Kontsevich
@AlekseyKontsevich:如果我理解正确,您想将一个变量从信号传递到插槽中?当然可以。将其作为lambda的参数,并在函数调用中使用该参数即可。但是,我建议您也使用值为“this”的上下文参数。这样,如果接收对象被销毁,您可以确保连接被销毁。否则,您可能会遇到未定义的行为。 - André

9
不,这是不可能的。您只能连接具有相应信号中参数数量小于或等于的插槽。(请参见文档) 您需要创建一个代理插槽,来调用所需的插槽。

1
这个答案已经不太适用了,因为在C++11的Qt5语法中,使用lambda函数来实现这个目的非常容易。 - André
1
@André,另一方面,您只需创建代理插槽,即可调用所需的插槽。现在已经就位。 - Lol4t0
1
当然可以。但是额外的插槽意味着您的标题中会有更多不需要的内容,暴露给外部调用(是的,即使私有插槽也可以从外部调用),并将您的代码分散到多个位置。您甚至可能需要额外的成员变量来包含要传递的值,从而在类中引入额外的状态。Lambda解决方案更加优雅,因此我认为引入代理插槽不是一个解决方案。 - André

6
从某种角度来说,是可以的。但它的功能不是很强大:只需像这样声明setDockWidget即可:
[virtual] void setDockWidget(bool state=false) ;

并且可以通过以下方式声明连接:

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

如果没有传递参数,setDockWidget将使用默认值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接