每当我点击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();
}
我已尝试过所有方法,但仍无法正常工作。 就像将整个功能放入插槽和一切。
答案 0 :(得分:3)
问题是show()
没有阻止。会发生以下情况:
QMessageBox
。show()
立即返回并保留该功能。这将破坏消息框。最简单的方法可能是使用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。