连接按钮到任意功能

Connecting button to an arbitrary function

本文关键字:功能 任意 按钮 连接      更新时间:2023-10-16

我试图在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,答案是错误的。