QMessageBox没有显示出来

时间:2018-05-17 07:38:05

标签: c++ qt qt5 qmessagebox

每当我点击2时它虽然出现但没有显示消息框,但它没有调用msg()函数。

我从一个插槽中调用它:

编辑:以下所需代码:

void msg()
{

    QMessageBox msgBox;
    msgBox.setText("Pressed 2!!!");
    msgBox.show();
    msgBox.exec();
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QPushButton *two = new QPushButton("2");
    QObject::connect(two, SIGNAL(clicked()),&app,SLOT(msg()));
    two->show();
    return app.exec();
}

我已尝试过所有方法,但仍无法正常工作。 就像将整个功能放入插槽和一切。

1 个答案:

答案 0 :(得分:3)

问题是show()没有阻止。会发生以下情况:

  1. 您创建一个具有本地范围的QMessageBox
  2. 你展示它。
  3. show()立即返回并保留该功能。这将破坏消息框。
  4. 最简单的方法可能是使用exec代替:

    void msg()
    {
    
        QMessageBox msgBox;
        msgBox.setText("Pressed 2!!!");
        msgBox.exec(); // This blocks until the user closes the message box
    }
    

    <强>更新

    此外,您的信号/插槽设置错误。如果要将按钮的单击信号绑定到函数,请使用如下的lambda表达式:

    QObject::connect(two, &QPushButton::clicked, []() { msg(); } );
    

    甚至直接连接到该功能:

    QObject::connect(two, &QPushButton::clicked, &msg);
    

    请注意,您仍然需要切换为exec而不是show; - )

    背景是当使用SLOT()时,您需要提供指定对象的插槽(即方法)。但是,Qt现在支持lambdas等现代(C ++ 11及更高版本)语言功能,因此可以直接与任何仿函数建立信号/插槽连接。为了获得一些背景,例如看看this blog post