我试图在Qt中编写一个程序,将函数连接到Qt5中的按钮。
#include <QApplication>
#include <QtGui>
#include <QPushButton>
static void insert()
{
qDebug() << “pressed”;
}
int main(int argc,char *argv[])
{
QApplication app(argc,argv);
QPushButton *button=new QPushButton(“button”);
button->setGeometry(50,100,150,80);
QObject::connect(button,&QPushButton::clicked,insert());
button->show();
}
但是我得到的错误像主要。抄送:23:39:error:在这个上下文中主要。Cc:23:55:错误:无效使用void表达式Make: * [main。0]错误1
请帮…
在Qt 5中,您需要使用新的Qt信号和插槽系统。连接如下所示:
QObject::connect(button,&QPushButton::clicked,insert); <-- no parentheses.
前面已经说过了,但是您需要调用app.exec();
来启动事件循环处理。否则连接将永远不会被触发。
此外,如果您处于释放模式,那么您可能看不到qDebug()
* 见下面的编辑
首先你不能把一个信号连接到一个函数,你应该把它连接到某个类的插槽,并且这个类的实例也应该提供给QObject::connect
。
// file 'C.h'
#ifndef __C_H__
#define __C_H__
#include <QtGui>
class C : public QObject{
Q_OBJECT
public slots:
static void insert()
{
qDebug() << "pressed";
}
};
#endif
注意,这个类必须继承QObject
,并且在它里面有Q_OBJECT
关键字。你必须把这个类声明在*.h
文件中(你不能在*.cpp
文件中有Q_OBJECT
,因为Qt不会看到它)。
QObject::connect
,正确的方法是:
QObject::connect(button, SIGNAL(clicked()), &c, SLOT(insert()));
注意,当你连接信号时,你必须使用SIGNAL()
宏和SLOT()
宏。
所以main.cpp
中的代码应该如下:
#include "C.h"
int main(int argc,char *argv[])
{
QApplication app(argc,argv);
QPushButton *button=new QPushButton("button");
button->setGeometry(50,100,150,80);
C c;
QObject::connect(button, SIGNAL(clicked()), &c, SLOT(insert()));
button->show();
return app.exec();
}
你看我是如何为connect()
函数提供一个接收对象(&c
)的实例的,即使你的函数是static
,你也必须这样做。
最后你必须使用app.exec();
,否则你的程序就不会有消息循环。
我没注意到这个问题是关于Qt 5的。对于Qt 5.0,答案是错误的。