我知道要在类中使用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窗口:
从上面的代码中,退出按钮连接到quit()
,这是一个Qt功能,当点击它有效时。分配给函数saveText()
的保存按钮配置为退出,但不会退出。
请告诉我在理解Qt中的信号和插槽时出错了。
答案 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