将按钮连接到任意功能

sar*_*ohn 5 c++ qt

我自己试图在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

请帮忙…

UmN*_*obe 8

在Qt 5中,您需要使用新的qt信号和插槽系统.连接看起来像:

QObject::connect(button,&QPushButton::clicked,insert); <-- no parentheses.
Run Code Online (Sandbox Code Playgroud)

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

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


Ter*_*man 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
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,答案是错误的。