c++ - Qt 5.3 信号和槽、简单函数和 Lambda 表达式

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

我尝试使用 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。

最佳答案

这适用于 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,因此我们创建了它首先在这里。

关于c++ - Qt 5.3 信号和槽、简单函数和 Lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25279301/

相关文章:

c++ - Vulkan:渲染时内存泄漏

c++ - Qt 的 BorderLayout 示例如何工作?

c++ - 取消选择 QCheckBox 时如何禁用 QPushButton

具有 2 个数据帧的 Python lambda 函数

默认参数的python函数

c++ - Dllimport 无法导入旧的 Borland dll

c++ - 在 Rcpp 中为 Galerkin 矩阵使用 Eigen c++ 库的问题

c++ - 如何将 char* 转换为 double?

c++ - Qt:为什么我的图像背景在 LinuxFb 上是绿色的?

lambda - 了解非法嵌套 `lambda` 调用