有时候我们可能遇到一个问题,我们想在A类里面定义一个事件,当这个事件被触发之后,它可以发射一个信号出来,让B,C,D类等其他类去执行一个功能,这些执行功能的类可能是一个QWidget类,或者是一个普通的类,我们可能遇到的问题是怎么让一个信号和槽跨越几个类?
最难的是,如果这些类之间有相互include的关系,比如A中的按钮单击之后,打开了B窗口,因此A类必须include B的头文件。而如果要利用A类发射其他信号来更改B类的一些特性,就需要在B类建立一个信号槽,而且B类要include A类的头文件,以使得信号槽的发送者可以查到。
从一个简单的例子开始讲起:
我们在VS中新建一个基于QMainwindow的工程,名为qt_signal_test,然后在Mainwindow中添加一个按钮,运行后界面为:
/////////////////////// main.cpp ///////////////////////////////////
#include "qt_signal_test.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
qt_signal_test w;
w.show();
return a.exec();
}
//////////////////// qt_signal_test.h /////////////////////////////
#ifndef QT_SIGNAL_TEST_H
#define QT_SIGNAL_TEST_H
#include <QtWidgets/QMainWindow>
#include "ui_qt_signal_test.h"
#include "qpushbutton.h"
#include "qlabel.h"
class qt_signal_test : public QMainWindow
{
Q_OBJECT
public:
qt_signal_test(QWidget *parent = 0);
~qt_signal_test();
QPushButton *button;
QLabel *label;
private:
Ui::qt_signal_testClass ui;
};
#endif // QT_SIGNAL_TEST_H
//////////////////// qt_signal_test.cpp /////////////////////////////
#include "qt_signal_test.h"
qt_signal_test::qt_signal_test(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
this->setGeometry(200, 200, 400, 400);
button = new QPushButton(this);
label = new QLabel(this);
button->setGeometry(50, 50, 60, 30);
label->setGeometry(100, 100, 60, 30);
button->setText(QString::fromLocal8Bit("确定"));
label->setText(QString::fromLocal8Bit("等待"));
}
qt_signal_test::~qt_signal_test()
{
}
我们新建一个关于button的槽函数,单击一次,label的文本就变化了。
//////////////////// qt_signal_test.h //////////////////////////////
#ifndef QT_SIGNAL_TEST_H
#define QT_SIGNAL_TEST_H
#include <QtWidgets/QMainWindow>
#include "ui_qt_signal_test.h"
#include "qpushbutton.h"
#include "qlabel.h"
class qt_signal_test : public QMainWindow
{
Q_OBJECT
public:
qt_signal_test(QWidget *parent = 0);
~qt_signal_test();
QPushButton *button;
QLabel *label;
private:
Ui::qt_signal_testClass ui;
public slots:
void changeMyText();
};
#endif // QT_SIGNAL_TEST_H
//////////////////// qt_signal_test.cpp /////////////////////////////
#include "qt_signal_test.h"