我尝试使用 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 来连接 QAbstractButton
的 clicked
信号和您的 exitToWin
简单函数。您也无法将 SIGNAL 连接到简单函数或 lambda,因此我们使用成员函数变体。
(2)
endBox 默认情况下实际上并没有获得“确定”按钮。当您在代码中的 (1)
行中提及它时,它会创建它,但(显然)没有及时将指针传递回 connect
,因此我们创建了它首先在这里。
关于c++ - Qt 5.3 信号和槽、简单函数和 Lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25279301/