2

我尝试使用 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 引导了什么。我也在这里阅读 并对其进行了测试。
此外,我尝试使用 lambda 表达式,如下所示:

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

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

4

3 回答 3

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,因此我们首先在此处创建它。

于 2014-08-13T06:43:51.003 回答
0

您的代码无法正常工作有两个原因:

首先,QMessageBox没有这样的信号。有关它确实具有的信号,请参阅文档

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

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

于 2014-08-13T06:41:13.380 回答
-1

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

于 2014-08-13T06:36:44.607 回答