QT Core | 信号槽03 - 自定义信号与槽
文章目錄
- 一、前言
- 二、新建一個(gè)QT控制臺(tái)項(xiàng)目
- 2.1、New File or Project
- 2.2、Project Location
- 2.3、Define Build System
- 2.4、Kit Selection
- 2.5、Project Application
- 2.6、生成的項(xiàng)目
- 三、創(chuàng)建類(lèi)
- 3.1、創(chuàng)建Newspaper類(lèi)
- 3.2、創(chuàng)建Reader類(lèi)
- 四、編寫(xiě)代碼
- 4.0、pro文件
- 4.1、newspaper.h
- 4.2、newspaper.cpp
- 4.3、reader.h
- 4.4、reader.cpp
- 4.5、main.cpp
- 五、Debug
- 六、用一個(gè)信號(hào)同步(觸發(fā))兩個(gè)槽
- 6.1、reader.h
- 6.2、reader.cpp
- 6.3、main.cpp
- 6.4、控制臺(tái)
一、前言
記住,信號(hào)與槽本質(zhì)都是返回類(lèi)型為void的函數(shù)。
QT提供的信號(hào)與槽,是QT的核心功能之一。它們跟QT的GUI沒(méi)有關(guān)系,所以編寫(xiě)沒(méi)有GUI的QT應(yīng)用程序也是可以使用QT的信號(hào)與槽的。值得注意的是,使用QT編寫(xiě)漂亮且模塊化的應(yīng)用程序必須要使用信號(hào)與槽。
只要用戶編寫(xiě)的類(lèi)繼承QObject類(lèi),就能使用信號(hào)與槽的功能。QT的signal(信號(hào))與slot(槽)本質(zhì)就是一個(gè)函數(shù),且不需要返回值,意識(shí)到這一點(diǎn)非常重要。從下圖可以看到,Object1的signal1可以同步(觸發(fā))Object2的slot1與slot2。Object1的signal2可以同步(觸發(fā))Object4的slot1。所以,QT的信號(hào)與槽有利于程序的模塊化。
請(qǐng)同學(xué)們務(wù)必學(xué)習(xí)豆子的博客上的《QT學(xué)習(xí)之路2(5)自定義信號(hào)槽》,才能看懂以下的內(nèi)容。博客地址:https://www.devbean.net/2012/08/qt-study-road-2-custom-signal-slot/
我的QT版本:
QT工程:
鏈接:https://pan.baidu.com/s/1lqoq0XhUgE1De8Ok1FPTHQ
提取碼:s6yp
二、新建一個(gè)QT控制臺(tái)項(xiàng)目
2.1、New File or Project
2.2、Project Location
2.3、Define Build System
2.4、Kit Selection
2.5、Project Application
2.6、生成的項(xiàng)目
三、創(chuàng)建類(lèi)
3.1、創(chuàng)建Newspaper類(lèi)
3.2、創(chuàng)建Reader類(lèi)
以同樣的方式創(chuàng)建Reader類(lèi)
四、編寫(xiě)代碼
4.0、pro文件
QT創(chuàng)建的項(xiàng)目默認(rèn)是C++11版本,目前大部分的C++教程都是使用C++14版本,所以我決定使用C++14版本。值得注意的是,C++版本越高并不代表越好,追求穩(wěn)定才是硬道理。
4.1、newspaper.h
#ifndef NEWSPAPER_H #define NEWSPAPER_H#include <QObject>class Newspaper : public QObject {Q_OBJECT public:explicit Newspaper(QObject *parent = nullptr);Newspaper(const QString& name);void send() const; /* 用于發(fā)送已有的信號(hào) */signals:/* 1、信號(hào)就是一個(gè)一個(gè)函數(shù)名,信號(hào)不需要返回變量,所以都是void.* 2、信號(hào)的函數(shù)不需要實(shí)現(xiàn),因?yàn)镼T的moc幫我們實(shí)現(xiàn)好了.* 3、信號(hào)的內(nèi)容是什么?其實(shí)就是函數(shù)的入口參數(shù).*/void newPaper(const QString& name) const; /* 聲明一個(gè)信號(hào)(newPaper) */public slots:private:QString m_name;};#endif // NEWSPAPER_H4.2、newspaper.cpp
#include "newspaper.h"Newspaper::Newspaper(QObject *parent) : QObject(parent) {}Newspaper::Newspaper(const QString& name):m_name(name) {}/* 該函數(shù)用于發(fā)送已經(jīng)定義好的信號(hào) */ void Newspaper::send() const {emit newPaper(m_name); //發(fā)送newPaper信號(hào),該信號(hào)的內(nèi)容是m_name }4.3、reader.h
#ifndef READER_H #define READER_H#include <QObject> #include <QDebug> class Reader : public QObject {Q_OBJECT public:explicit Reader(QObject *parent = nullptr);signals:public slots:void receiveNewspaper(const QString& name) const; };#endif // READER_H4.4、reader.cpp
#include "reader.h"Reader::Reader(QObject *parent) : QObject(parent) {}void Reader::receiveNewspaper(const QString& name) const {qDebug() << "Receives Newspaper: " << name; }4.5、main.cpp
#include <QCoreApplication>#include "newspaper.h" #include "reader.h"int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);Newspaper newspaper("Newspaper A"); /* 創(chuàng)建newspaper對(duì)象 */Reader reader; /* 創(chuàng)建reader對(duì)象 *//* 建立信號(hào)與槽 */QObject::connect(&newspaper,&Newspaper::newPaper,&reader, &Reader::receiveNewspaper);newspaper.send(); /* 調(diào)用信號(hào),并觸發(fā)對(duì)應(yīng)的槽 */return a.exec(); }五、Debug
編譯,運(yùn)行??刂婆_(tái)輸出一條字符串。
返回上面的代碼可以了解到,newspaper對(duì)象不具備打印字符串到控制臺(tái)的功能,只有reader對(duì)象才能往控制臺(tái)輸出字符串。所以,上面的字符串肯定是reader對(duì)象得槽函數(shù)打印出來(lái)的。
六、用一個(gè)信號(hào)同步(觸發(fā))兩個(gè)槽
上面的例子是1個(gè)信號(hào)同步一個(gè)槽,根據(jù)官方的介紹,1個(gè)信號(hào)可以同步多個(gè)槽的。所以,這里嘗試增加多一個(gè)槽。
信號(hào)的代碼不需要修改,所以newspaper.cpp與newspaper.h不用修改(Newspaper類(lèi)不用修改)。槽的代碼需要修改一下,因?yàn)橐oreader增加一個(gè)類(lèi)屬性my_name。
6.1、reader.h
#ifndef READER_H #define READER_H#include <QObject> #include <QDebug> class Reader : public QObject {Q_OBJECT public:explicit Reader(QObject *parent = nullptr);Reader(const QString& name); //增加一個(gè)構(gòu)造函數(shù)signals:public slots:void receiveNewspaper(const QString& name) const ;private:QString my_name; //增加名字 };#endif // READER_H6.2、reader.cpp
#include "reader.h"Reader::Reader(QObject *parent) : QObject(parent) {}Reader::Reader(const QString& name):my_name(name) {}void Reader::receiveNewspaper(const QString& name) const {qDebug() <<"I am" << this->my_name << "Receives Newspaper: " << name; }6.3、main.cpp
#include <QCoreApplication> #include "newspaper.h" #include "reader.h"int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);Newspaper newspaper("Newspaper A"); /* 創(chuàng)建newspaper對(duì)象 */Reader reader_A("reader_A"); /* 創(chuàng)建reader_A對(duì)象 */Reader reader_B("reader_B"); /* 創(chuàng)建reader_B對(duì)象 *//* 建立信號(hào)與槽 */QObject::connect(&newspaper,&Newspaper::newPaper,&reader_A, &Reader::receiveNewspaper);/* 建立信號(hào)與槽 */QObject::connect(&newspaper,&Newspaper::newPaper,&reader_B, &Reader::receiveNewspaper);newspaper.send(); /* 調(diào)用信號(hào),并觸發(fā)對(duì)應(yīng)的槽 */return a.exec(); }6.4、控制臺(tái)
總結(jié)
以上是生活随笔為你收集整理的QT Core | 信号槽03 - 自定义信号与槽的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: RTX5 | 内存池01 - 内存池的使
- 下一篇: QT Core | 信号槽02 - GU