【问题标题】:Qt 5.3 Signals and Slots, Simple Function and Lambda ExpressionQt 5.3 信号和槽、简单函数和 Lambda 表达式
【发布时间】:2014-08-13 06:20:07
【问题描述】:

我尝试使用 Qt 5.3 编写程序,并尝试使用信号和插槽作为练习。我写了以下代码(部分代码):

void exitToWin()
    {
        exit(0);
    }
int main(int argc, char *argv[])
{

    QApplication a(argc, argv);
    MainWindow w;
    QMessageBox EndBox;
    QObject::connect((EndBox.button(QMessageBox::Ok)),SIGNAL(clicked()),exitToWin);
    w.show();
    EndBox.show();
    return a.exec();
}

我什至将函数的声明更改为static,并在编写connect 命令时检查了带括号和不带括号的表达式。但是尽管 Qt 记录了什么以及它的 IDE 引导了什么。我还阅读了here 并对其进行了测试。
此外,我尝试使用 lambda 表达式如下:

QObject::connect((EndBox.button(QMessageBox::Ok)),SIGNAL(clicked()),[=](){
    exit(0);
});

但我仍然收到错误提示“没有匹配的函数调用”。
毕竟我不得不说我使用的是 Microsoft Windows 7。

【问题讨论】:

标签: c++ qt lambda signals-slots qt5.3


【解决方案1】:

这适用于 Qt 5.3:

#include <QtWidgets>

void exitToWin()
{
    exit(0);
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QMainWindow w;
    QMessageBox endBox;
    endBox.addButton(QMessageBox::Ok); // (2)
    endBox.connect(endBox.button(QMessageBox::Ok), 
                   &QAbstractButton::clicked, exitToWin); // (1)
    /* This works, too:
    endBox.connect(endBox.button(QMessageBox::Ok),
                   &QAbstractButton::clicked,
                   [] () { exit(0); });
    */
    w.show();
    endBox.show();
    return a.exec();
}

原因如下:

(1) 您可以使用endBox 的QObject 来连接QAbstractButtonclicked 信号和您的exitToWin 简单函数。您也不能将 SIGNAL 连接到简单函数或 lambda,因此我们使用成员函数变体。

(2) endBox 默认情况下实际上并没有获得确定按钮。当您在代码中的(1) 行提及它时,它会创建它,但没有及时(显然)将指针传递回connect,因此我们首先在此处创建它。

【讨论】:

  • 非常感谢,我测试了其他东西,正如您在第 2 行中提到的,我们也可以使用 QPushButtom,它可以工作,我认为问题与您在第 2 行中提到的有关。跨度>
  • 问题还是出在 lambda 表达式上,你能帮忙吗?
  • 确保设置了-std=c++11 标志。
  • 我在内置步骤中添加了但收到未知命令错误
【解决方案2】:

您的代码无法运行有两个原因:

首先,QMessageBox 没有这样的信号。请参阅the documentation 了解它确实具有的信号。

其次,在将信号连接到槽(或 lambda 函数)时,您必须定义函数签名,而不是特定值。

如果一个信号可以传递多种值,并且您只希望您的插槽对这些值的选择执行特定功能(在这种情况下,只有当值 QMessageBox::Ok 被传递时)它取决于插槽询问值,而不是 connect 语句。

【讨论】:

  • 感谢您的有用提示。
【解决方案3】:

由于 connect() 方法来自 QObject 它必须从包含 Q_OBJECTQObject 子级调用em> 宏在其声明中。运行 qmake 准备类发送信号和接收槽。

【讨论】:

  • QObject::connect 是一个静态函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多