Qt 5.3信号和插槽,简单函数和Lambda表达式

时间:2014-08-13 06:20:08

标签: 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。

3 个答案:

答案 0 :(得分:4)

这适用于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在QAbstractButton clicked信号与exitToWin信号之间建立联系简单的功能。您也无法将SIGNAL连接到简单函数或lambda,因此我们使用成员函数变体。

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

答案 1 :(得分:0)

您的代码无法正常工作:

首先,QMessageBox没有这样的信号。有关它所具有的信号,请参见the documentation

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

如果信号可以传递各种值,并且您只希望您的插槽在选择这些值时执行某个功能(在这种情况下,仅在值QMessageBox::Ok通过时),则由询问值的槽,而不是connect语句。

答案 2 :(得分:-1)

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