无法将信号连接到main()内的函数

时间:2013-05-24 12:05:10

标签: c++ qt user-interface qt4

我知道要在类中使用Qt的信号和插槽机制,该类必须包含Q_OBJECT宏,但我试图在main()中使用信号和插槽,而不使用任何一个班级。

到目前为止,这是我的代码:

#include <QApplication>
#include <QWidget>
#include <QTextEdit>
#include <QtGui>

void saveText();

int main(int argv, char **args)
 {
    QApplication app(argv, args);
    QTextEdit textEdit;
    QPushButton saveButton("Save!");
    QPushButton exitButton("Exit!");
    QObject::connect(&exitButton,SIGNAL(clicked()),qApp,SLOT(quit()));
    QObject::connect(&saveButton,SIGNAL(clicked()),qApp,SLOT(saveText()));

    QVBoxLayout vlyt;
    vlyt.addWidget(&textEdit);
    vlyt.addWidget(&exitButton);
    vlyt.addWidget(&saveButton);

    QWidget mainWindow;
    mainWindow.setLayout(&vlyt);
    mainWindow.show();

    return app.exec();
}

void saveText()
{
    exit(0);
}

这是生成的GUI窗口:

GUI window

从上面的代码中,退出按钮连接到quit(),这是一个Qt功能,当点击它有效时。分配给函数saveText()的保存按钮配置为退出,但不会退出。

请告诉我在理解Qt中的信号和插槽时出错了。

3 个答案:

答案 0 :(得分:7)

...的Qt4

  

从QObject或其子类之一继承的所有类(例如,   QWidget)可以包含信号和插槽。1

因此,无法使用位于QObject个孩子之外的广告位。

您可以将信号连接到从QObject派生的类中的插槽。将您的插槽放在一个分开的 .h / .cpp 文件中的类中:

class MyClass : public QObject
{
   Q_OBJECT

   ...

   public slots:
     void saveText();

};

根据Qt5:New Signal Slot Syntax in Qt 5。您可以连接到这些类型的全局函数。 (感谢@ thuga的评论

答案 1 :(得分:2)

我只想在这里举例。

<强> main.cpp中:

#include <QCoreApplication>
#include <iostream>
#include <QObject>
#include "siggen.h"

void handler(int val){
  std::cout << "got signal: " << val << std::endl;
}

int main(int argc, char *argv[])
{
  SigGen siggen;
  QObject::connect(&siggen, &SigGen::sgAction, handler);
  siggen.action();

  QCoreApplication a(argc, argv);
  std::cout << "main prog start" << std::endl;

  return a.exec();
}

<强> siggen.h:

#ifndef SIGGEN_H
#define SIGGEN_H

#include <QObject>

class SigGen : public QObject
{
  Q_OBJECT

public:
  explicit SigGen(QObject *parent = 0);
  void action(void);

signals:
  void sgAction(int value);
};

#endif // SIGGEN_H

<强> siggen.cpp:

#include "siggen.h"

SigGen::SigGen(QObject *parent) : QObject(parent)
{}

void SigGen::action()
{
  emit sgAction(42);
}

答案 2 :(得分:-1)

connect(&saveButton, &QPushButton::clicked, [](){saveText();});  // qt5.9.6