将按钮连接到任意功能

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()函数提供一个接收器对象(&amp;c)的实例,即使你的函数是static,你也必须这样做。

最后你必须app.exec();,否则你的程序不会有消息循环。

编辑:

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

【讨论】:

@UmNyobe 谢谢。我完全错过了它是关于 Qt5.0

以上是关于将按钮连接到任意功能的主要内容,如果未能解决你的问题,请参考以下文章

Tableau 可以连接到任意 REST API 作为数据源吗?

csgo连接到任意服务器失败为啥?

将一行连接到另一个表中的多行

将系列连接到具有列名的数据框中

如何将情节提要中的多个按钮连接到单个动作?

将一行连接到Mysql中另一个表中的多行