我自己试图在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();
}
Run Code Online (Sandbox Code Playgroud)
但我收到的错误如main.cc:23:39:错误:在此上下文中main.cc:23:55:错误:无效使用void表达式make:* [main.o]错误1
请帮忙…
在Qt 5中,您需要使用新的qt信号和插槽系统.连接看起来像:
QObject::connect(button,&QPushButton::clicked,insert); <-- no parentheses.
Run Code Online (Sandbox Code Playgroud)
它已经说明了,但你需要调用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
Run Code Online (Sandbox Code Playgroud)
请注意,该类必须继承并在其中QObject包含关键字。Q_OBJECT您必须将此类声明放入文件中*.h(文件中不能有Q_OBJECT' ,*.cpp因为 Qt 不会看到它)。
现在您已经有了一个带有插槽的类,您可以使用QObject::connect,正确的方法是:
QObject::connect(button, SIGNAL(clicked()), &c, SLOT(insert()));
Run Code Online (Sandbox Code Playgroud)
请注意,连接它们时,必须使用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();
}
Run Code Online (Sandbox Code Playgroud)
&c您看到我如何提供接收器对象 ( )的实例来connect()运行,即使您的函数是 ,您也必须这样做static。
最后你必须这样做app.exec();,因为否则你的程序将不会有消息循环。
编辑:
我错过了这个问题是关于 Qt 5 的。对于 Qt 5.0,答案是错误的。
| 归档时间: |
|
| 查看次数: |
8354 次 |
| 最近记录: |