QT Core | 信号槽03 - 自定义信号与槽
文章目录
- 一、前言
- 二、新建一个QT控制台项目
- 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、生成的项目
- 三、创建类
- 3.1、创建Newspaper类
- 3.2、创建Reader类
- 四、编写代码
- 4.0、pro文件
- 4.1、newspaper.h
- 4.2、newspaper.cpp
- 4.3、reader.h
- 4.4、reader.cpp
- 4.5、main.cpp
- 五、Debug
- 六、用一个信号同步(触发)两个槽
- 6.1、reader.h
- 6.2、reader.cpp
- 6.3、main.cpp
- 6.4、控制台
一、前言
记住,信号与槽本质都是返回类型为void的函数。
QT提供的信号与槽,是QT的核心功能之一。它们跟QT的GUI没有关系,所以编写没有GUI的QT应用程序也是可以使用QT的信号与槽的。值得注意的是,使用QT编写漂亮且模块化的应用程序必须要使用信号与槽。
只要用户编写的类继承QObject类,就能使用信号与槽的功能。QT的signal(信号)与slot(槽)本质就是一个函数,且不需要返回值,意识到这一点非常重要。从下图可以看到,Object1的signal1可以同步(触发)Object2的slot1与slot2。Object1的signal2可以同步(触发)Object4的slot1。所以,QT的信号与槽有利于程序的模块化。
请同学们务必学习豆子的博客上的《QT学习之路2(5)自定义信号槽》,才能看懂以下的内容。博客地址:https://www.devbean.net/2012/08/qt-study-road-2-custom-signal-slot/
我的QT版本:
QT工程:
链接:https://pan.baidu.com/s/1lqoq0XhUgE1De8Ok1FPTHQ
提取码:s6yp
二、新建一个QT控制台项目
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、生成的项目
三、创建类
3.1、创建Newspaper类
3.2、创建Reader类
以同样的方式创建Reader类
四、编写代码
4.0、pro文件
QT创建的项目默认是C++11版本,目前大部分的C++教程都是使用C++14版本,所以我决定使用C++14版本。值得注意的是,C++版本越高并不代表越好,追求稳定才是硬道理。
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; /* 用于发送已有的信号 */signals:/* 1、信号就是一个一个函数名,信号不需要返回变量,所以都是void.* 2、信号的函数不需要实现,因为QT的moc帮我们实现好了.* 3、信号的内容是什么?其实就是函数的入口参数.*/void newPaper(const QString& name) const; /* 声明一个信号(newPaper) */public slots:private:QString m_name;};#endif // NEWSPAPER_H
4.2、newspaper.cpp
#include "newspaper.h"Newspaper::Newspaper(QObject *parent) : QObject(parent)
{}Newspaper::Newspaper(const QString& name):m_name(name)
{}/* 该函数用于发送已经定义好的信号 */
void Newspaper::send() const
{emit newPaper(m_name); //发送newPaper信号,该信号的内容是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_H
4.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"); /* 创建newspaper对象 */Reader reader; /* 创建reader对象 *//* 建立信号与槽 */QObject::connect(&newspaper,&Newspaper::newPaper,&reader, &Reader::receiveNewspaper);newspaper.send(); /* 调用信号,并触发对应的槽 */return a.exec();
}
五、Debug
编译,运行。控制台输出一条字符串。
返回上面的代码可以了解到,newspaper对象不具备打印字符串到控制台的功能,只有reader对象才能往控制台输出字符串。所以,上面的字符串肯定是reader对象得槽函数打印出来的。
六、用一个信号同步(触发)两个槽
上面的例子是1个信号同步一个槽,根据官方的介绍,1个信号可以同步多个槽的。所以,这里尝试增加多一个槽。
信号的代码不需要修改,所以newspaper.cpp与newspaper.h不用修改(Newspaper类不用修改)。槽的代码需要修改一下,因为要给reader增加一个类属性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); //增加一个构造函数signals:public slots:void receiveNewspaper(const QString& name) const ;private:QString my_name; //增加名字
};#endif // READER_H
6.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"); /* 创建newspaper对象 */Reader reader_A("reader_A"); /* 创建reader_A对象 */Reader reader_B("reader_B"); /* 创建reader_B对象 *//* 建立信号与槽 */QObject::connect(&newspaper,&Newspaper::newPaper,&reader_A, &Reader::receiveNewspaper);/* 建立信号与槽 */QObject::connect(&newspaper,&Newspaper::newPaper,&reader_B, &Reader::receiveNewspaper);newspaper.send(); /* 调用信号,并触发对应的槽 */return a.exec();
}
6.4、控制台
QT Core | 信号槽03 - 自定义信号与槽相关推荐
- Linux学习之系统编程篇: 阻塞信号集、未决信号集、自定义信号集
阻塞信号集和未决信号集在内核 PCB 中,因此我们无法操作,但是可以操作自定义信号集,然后将其通过函数映射给阻塞信号集来间接操作. 信号集本质:位图(1-31 号)
- QT QML 在qml中自定义信号
服从真理,就能征服一切事物. -- 塞涅卡 实例: 自定义文件 MoveYou.qml: import QtQuick 2.5 import QtQuick.Controls 1.4 import Q ...
- 【QT开发笔记-基础篇】| 第一章 QT入门 | 1.6 自定义信号槽
本节对应的视频讲解:B_站_链_接 https://www.bilibili.com/video/BV1gA4y1d7gz 上节课,我们讲解了标准信号槽,标准信号槽中,信号和槽函数,都是 Qt 框架定 ...
- 《PyQt5高级编程实战》自定义信号详解
自定义信号详解 1. 创建自定义信号 2. 让自定义信号携带值 3. 自定义信号的重载版本 4. 窗口间通信 5. 线程间通信 PyQt5中各个控件自带的信号已经能够让我们完成许多需求,但是如果想要更 ...
- Qt 自定义信号与槽
注 对象与槽理解 //第一个参数lineEdit是激发事件对象,信号中的方法必须在对象中存在,并在对象类头文件signals下定义,//第二个参数信号,//第三个参数this是槽方法所属类的对象,且必 ...
- Qt信号与槽传递自定义数据类型——两种解决方法
Qt信号与槽传递自定义数据类型--两种解决方法 参考文章: (1)Qt信号与槽传递自定义数据类型--两种解决方法 (2)https://www.cnblogs.com/tid-think/p/9300 ...
- QT信号与槽(自定义带参数的信号)
关于QT信号与槽的问题其实每个初学QT的人都会遇到,当时我需要做一个带界面的demo,在信号和槽的问题上,我需要的想法是让槽可以有参数的进行操作,但是系统内置的clicked()信号是不含参数的,这对 ...
- VS2008 Qt Designer 中自定义信号槽
一.Qt Designer自定义槽函数 发现:在VS2008 +Qt4.7 中打开ui文件,所用的英文QT Designer工具,没有转到槽函数的功能,不如QtCreator自带的QtDesigne ...
- 【Qt教程】1.6 - Qt5信号与槽、Single Slot emit、自定义信号、自定义槽
信号与槽 1. 说明 概念:信号和槽,是Qt对象间通信的接口.信号Signal.槽Slot,分别对应着事件的发送端和接受端. 语法: connect( 信号的发送者, 发送的具体信号, 信号的接收者, ...
最新文章
- 数据蒋堂 | 大数据计算语法的SQL化
- 云计算,从“资源时代”迈入“功能时代”
- ORACLE包和过程依赖关系测试
- c++ 0.你好,世界
- Linux下切换用户出现su: Authentication failure的解决办法
- DOM全屏Api requestFullscreen
- c++ 接口继承和实现继承
- 智慧医院信息化建设(整体解决方案)
- pcb板制作流程图解
- 【Axure】动态图表设计-柱状图、折线图、饼图(免费下载)
- window.name属性
- 腾讯蔡晨:十年沉淀,腾讯iOA为企业安全保驾护航
- 远程主机强迫关闭了一个现有的连接.
- ios项目编译错误:error: Multiple commands produce 'Faun.app/Assets.car'
- OJ 1168 改写整数
- mac使用mysql出现的错误 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
- 坚果云 linux程序名称,备份Linux系统数据到坚果云
- Facebook广告投放的正确姿势:玩转目标定位
- 扫描仪CCC认证注意事项及标准依据
- watir安装及中文支持问题