将按钮连接到任意功能
Posted
技术标签:
【中文标题】将按钮连接到任意功能【英文标题】:Connecting button to an arbitrary function 【发布时间】:2013-05-24 05:28:04 【问题描述】:我自己试图在 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();
但是我遇到了类似的错误 main.cc:23:39:错误:在此上下文中 main.cc:23:55:错误:无效使用无效表达式 make: * [main.o] 错误 1
请帮忙……
【问题讨论】:
我对 qt 5 了解不多,但我认为您需要删除insert()
到 insert
中的括号。
我不了解 Qt 但您的函数调用 QObject::connect
与此处给出的原型不匹配 Qt。
另外,我怀疑在 main
函数末尾没有 return app.exec()
时这将起作用。
【参考方案1】:
在 Qt 5 中,您需要使用新的qt signal and slots system。连接将如下所示:
QObject::connect(button,&QPushButton::clicked,insert); <-- no parentheses.
上面已经说明了,但是需要调用app.exec();
来启动事件循环处理。否则永远不会触发连接。
此外,如果您处于发布模式,那么您可能看不到 qDebug()
的输出
【讨论】:
即使我使用的是 Qt 5.4,它也会抛出错误spinBox: must be a class or namespace when followed by ::
。【参考方案2】:
*见下方编辑
首先你不能将信号连接到一个函数,你应该把它连接到某个类的一个槽,并且这个类的一个实例也应该提供给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,答案是错误的。
【讨论】:
@UmNyobe 谢谢。我完全错过了它是关于 Qt5.0以上是关于将按钮连接到任意功能的主要内容,如果未能解决你的问题,请参考以下文章