我尝试使用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。
答案 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 准备发送信号和接收插槽的类。