我有一个QPushButton,当我点击按钮时,我将调用一个带有两个参数的方法,在本例中为:exampleMethod(int i, double d)
。
现在我将点击事件从QPushButton button
连接到exampleMethod,如下所示:
connect(button, &QPushButton::clicked,this, &Example::exampleMethod);
但这不起作用,因为clicked()
和exampleMethod(int, double)
的参数不兼容。
现在我创建了一个额外的信号:exampleSignal(int i, double d)
以连接到我的插槽:
connect(this, &Example::exampleSignal, this, &Example::exampleMethod);
还有一个没有参数的附加插槽:exampleMethodToCallFromButtonClick()
从QPushButton中调用它clicked(),我在其中调用信号:
Example::Example(QWidget *parent) : QWidget(parent){
button = new QPushButton("Click", this);
connect(button, &QPushButton::clicked,this, &Example::exampleMethodToCallFromButtonClick);
connect(this, &Example::exampleSignal, this, &Example::exampleMethod);
}
void Example::exampleMethod(int i, double d){
qDebug() << "ExampleMethod: " << i << " / " << d;
}
void Example::exampleMethodToCallFromButtonClick(){
emit exampleSignal(5,3.6);
}
这很好用。
1)现在我的第一个问题:这真的是最好的方法没有lambda 吗?
使用lambda它看起来更好,我不需要两个连接语句:
connect(button, &QPushButton::clicked, [this]{exampleMethod(5, 3.6);});
2)我的第二个问题: with lamba 这是最好的方法,还是有更好的方法来解决它?
我还考虑将exampleMethod
中的参数保存为成员变量,调用不带参数的方法,而不是参数成员变量,但我认为这不是一个好方法。
感谢您的帮助!
答案 0 :(得分:3)
我不会做其中任何一件事。接收信号,收集参数,然后拨打return 0;
。当您在连接点知道参数时,lambda更合适。
exampleMethod
答案 1 :(得分:1)
除了单方法方法in the other answer之外,i
和d
的值可能不相关,因此将它们分解为自己的方法是有意义的:
int Example::iValue() const {
...
}
double Example::dValue() const {
...
}
然后,以下是等效的:
connect(..., this, [this]{ exampleMethod(iValue(), dValue()); });
connect(..., this, std::bind(&Example::exampleMethod, this, iValue(), dValue()));
onButtonClicked()
与iValue()
和dValue()
的使用之间的选择主要取决于在单独考虑因素时这些值是否有用,以及对于代码理解是否有意义指定来自connect
网站的电话,或将其转移到单个方法。
最后,如果您使用the single-method approach,并且按钮是使用setupUi
实例化的,即您在Designer中设计了Example
,则可以保存{{1}通过适当地命名处理程序方法来调用:
connect
Q_SLOT void Example::on_button_clicked();
这里是.ui文件中按钮对象的名称。该连接将由button
自动进行。