6

我自己试图在 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: error: in this context main.cc:23:55: error: invalid use of void expression make: * [main.o] Error 1

请帮忙……</p>

4

2 回答 2

9

在 Qt 5 中,您需要使用新的qt 信号和插槽系统。连接将如下所示:

QObject::connect(button,&QPushButton::clicked,insert); <-- no parentheses.

已经说过了,但是你需要调用app.exec();来启动事件循环处理。否则永远不会触发连接。

此外,如果您处于发布模式,那么您可能看不到qDebug()

于 2013-05-24T08:09:08.507 回答
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文件中(文件中不能有Q_OBJECT's,*.cpp因为 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();
   }

你看我是如何提供一个接收器对象 ( &c) 的实例来connect()运行的,即使你的函数是static.

最后你必须这样做app.exec();,否则你的程序将没有消息循环。

编辑:

我错过了关于 Qt 5 的问题。对于 Qt 5.0,答案是错误的。

于 2013-05-24T07:37:31.863 回答