C++ 这是在Qt信号和插槽中使用参数调用函数的好方法吗

C++ 这是在Qt信号和插槽中使用参数调用函数的好方法吗,c++,qt,C++,Qt,我有一个QPushButton,当我单击该按钮时,我将调用一个带有两个参数的方法,在本例中:exampleMethod(inti,double d) 现在,我将QPushButton按钮的click事件连接到exampleMethod,如下所示: connect(按钮,&QPushButton::clicked,this,&Example::Example方法) 但是这不起作用,因为clicked()和exampleMethod(int,double)的参数不兼容 现在我创建了一个额外的信号:e

我有一个QPushButton,当我单击该按钮时,我将调用一个带有两个参数的方法,在本例中:
exampleMethod(inti,double d)

现在,我将QPushButton
按钮的click事件连接到exampleMethod,如下所示:
connect(按钮,&QPushButton::clicked,this,&Example::Example方法)

但是这不起作用,因为
clicked()
exampleMethod(int,double)
的参数不兼容

现在我创建了一个额外的信号:
exampleSignal(inti,double d)
来连接我的插槽:
connect(this,&Example::exampleSignal,this,&Example::Example方法)

还有一个没有参数的附加插槽:
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);
}
Example::Example(QWidget*parent):QWidget(parent){
按钮=新的QPushButton(“单击”,此按钮);
连接(按钮,&QPushButton::单击,此,&Example::exampleMethodToCallFromButtonClick);
连接(此,&Example::exampleSignal,此,&Example::exampleMethod);
}
void示例::exampleMethod(int i,double d){

qDebug()这两件事我都不会做。接收信号,收集参数,然后调用
exampleMethod
。当参数在连接点已知时,lambda更合适

Example::Example(QWidget *parent) : QWidget(parent){

    button = new QPushButton("Click", this);

    connect(button, &QPushButton::clicked, this, &Example::onButtonClicked);
}

void Example::exampleMethod(int i, double d){
    qDebug() << "ExampleMethod: " << i << " / " << d;
}

void Example::onButtonClicked(){
    int i = ...;
    double d = ...;
    exampleMethod(i, d);
}
Example::Example(QWidget*parent):QWidget(parent){
按钮=新的QPushButton(“单击”,此按钮);
连接(按钮,&QPushButton::单击,此,&Example::onButtonClicked);
}
void示例::exampleMethod(int i,double d){

qDebug()这两件事我都不会做。接收信号,收集参数,然后调用
exampleMethod
。当参数在连接点已知时,lambda更合适

Example::Example(QWidget *parent) : QWidget(parent){

    button = new QPushButton("Click", this);

    connect(button, &QPushButton::clicked, this, &Example::onButtonClicked);
}

void Example::exampleMethod(int i, double d){
    qDebug() << "ExampleMethod: " << i << " / " << d;
}

void Example::onButtonClicked(){
    int i = ...;
    double d = ...;
    exampleMethod(i, d);
}
Example::Example(QWidget*parent):QWidget(parent){
按钮=新的QPushButton(“单击”,此按钮);
连接(按钮,&QPushButton::单击,此,&Example::onButtonClicked);
}
void示例::exampleMethod(int i,double d){

qDebug()除了单一方法外,
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
站点指定调用或将其移动到单独的方法是否有意义

最后,如果确实使用了,并且按钮被实例化为
setupUi
,即您在Designer中设计了
Example
,则可以通过适当地命名处理程序方法来保存
connect
调用:

Q_SLOT void Example::on_button_clicked();

按钮
这里是.ui文件中按钮对象的名称。该连接将由
ui::Example::setupUi(QWidget*)自动建立

除了单一方法方法外,
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
站点指定调用或将其移动到单独的方法是否有意义

最后,如果确实使用了,并且按钮被实例化为
setupUi
,即您在Designer中设计了
Example
,则可以通过适当地命名处理程序方法来保存
connect
调用:

Q_SLOT void Example::on_button_clicked();

按钮
这里是.ui文件中按钮对象的名称。将通过
ui::Example::setupUi(QWidget*)自动建立连接

lambda是一种很好的方法。在
exampleMethodToCallFromButtonClick()中
,无需使用信号来调用
exampleMethod
。您可以直接调用函数,而无需依赖信号/slot。5和3.6是从哪里来的?如果您通过一些计算得到它们,您可以在插槽中执行,而无需作为参数传入。谢谢,对于您的答案,您的回答是正确的。@Jerry 5和3.6将来自QTextEdit“有了lambda,它看起来更漂亮”并不是我每天都会看到的评论。:)但说真的,如果你用一个按钮点击来发出一个基于一些参数值的信号,只需持久化/存储/序列化这些值,这些值可能可以用其他一些小部件编辑。足够简单,是吗?lambda是一个好方法。在
exampleMethodToCallFromButtonClick()中
,无需使用信号来调用
exampleMethod
。您可以直接调用函数,而不依赖信号/slot。5和3.6是从哪里来的?如果您通过一些计算得到它们,您可以在插槽中执行,而无需作为参数传入Hanks,对于您的答案,您可以。@Jerry 5和3.6将来自QTextEdit”对于lambda,它看起来更漂亮”这不是我每天都会看到的评论。:)但说真的,如果你使用按钮点击来发出基于某些参数值的信号,只需持久化/存储/序列化这些值,这些值可能可以使用其他小部件进行编辑。足够简单,是吗?