这是在Qt信号和插槽

时间:2018-03-20 11:03:47

标签: c++ qt

我有一个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中的参数保存为成员变量,调用不带参数的方法,而不是参数成员变量,但我认为这不是一个好方法。

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

我不会做其中任何一件事。接收信号,收集参数,然后拨打return 0; 。当您在连接点知道参数时,lambda更合适。

exampleMethod

答案 1 :(得分:1)

除了单方法方法in the other answer之外,id的值可能不相关,因此将它们分解为自己的方法是有意义的:

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自动进行。