文章目录

  • 一、前言
  • 二、新建一个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 - 自定义信号与槽相关推荐

  1. Linux学习之系统编程篇: 阻塞信号集、未决信号集、自定义信号集

    阻塞信号集和未决信号集在内核 PCB 中,因此我们无法操作,但是可以操作自定义信号集,然后将其通过函数映射给阻塞信号集来间接操作. 信号集本质:位图(1-31 号)

  2. QT QML 在qml中自定义信号

    服从真理,就能征服一切事物. -- 塞涅卡 实例: 自定义文件 MoveYou.qml: import QtQuick 2.5 import QtQuick.Controls 1.4 import Q ...

  3. 【QT开发笔记-基础篇】| 第一章 QT入门 | 1.6 自定义信号槽

    本节对应的视频讲解:B_站_链_接 https://www.bilibili.com/video/BV1gA4y1d7gz 上节课,我们讲解了标准信号槽,标准信号槽中,信号和槽函数,都是 Qt 框架定 ...

  4. 《PyQt5高级编程实战》自定义信号详解

    自定义信号详解 1. 创建自定义信号 2. 让自定义信号携带值 3. 自定义信号的重载版本 4. 窗口间通信 5. 线程间通信 PyQt5中各个控件自带的信号已经能够让我们完成许多需求,但是如果想要更 ...

  5. Qt 自定义信号与槽

    注 对象与槽理解 //第一个参数lineEdit是激发事件对象,信号中的方法必须在对象中存在,并在对象类头文件signals下定义,//第二个参数信号,//第三个参数this是槽方法所属类的对象,且必 ...

  6. Qt信号与槽传递自定义数据类型——两种解决方法

    Qt信号与槽传递自定义数据类型--两种解决方法 参考文章: (1)Qt信号与槽传递自定义数据类型--两种解决方法 (2)https://www.cnblogs.com/tid-think/p/9300 ...

  7. QT信号与槽(自定义带参数的信号)

    关于QT信号与槽的问题其实每个初学QT的人都会遇到,当时我需要做一个带界面的demo,在信号和槽的问题上,我需要的想法是让槽可以有参数的进行操作,但是系统内置的clicked()信号是不含参数的,这对 ...

  8. VS2008 Qt Designer 中自定义信号槽

    一.Qt Designer自定义槽函数 发现:在VS2008 +Qt4.7  中打开ui文件,所用的英文QT Designer工具,没有转到槽函数的功能,不如QtCreator自带的QtDesigne ...

  9. 【Qt教程】1.6 - Qt5信号与槽、Single Slot emit、自定义信号、自定义槽

    信号与槽 1. 说明 概念:信号和槽,是Qt对象间通信的接口.信号Signal.槽Slot,分别对应着事件的发送端和接受端. 语法: connect( 信号的发送者, 发送的具体信号, 信号的接收者, ...

最新文章

  1. 数据蒋堂 | 大数据计算语法的SQL化
  2. 云计算,从“资源时代”迈入“功能时代”
  3. ORACLE包和过程依赖关系测试
  4. c++ 0.你好,世界
  5. Linux下切换用户出现su: Authentication failure的解决办法
  6. DOM全屏Api requestFullscreen
  7. c++ 接口继承和实现继承
  8. 智慧医院信息化建设(整体解决方案)
  9. pcb板制作流程图解
  10. 【Axure】动态图表设计-柱状图、折线图、饼图(免费下载)
  11. window.name属性
  12. 腾讯蔡晨:十年沉淀,腾讯iOA为企业安全保驾护航
  13. 远程主机强迫关闭了一个现有的连接.
  14. ios项目编译错误:error: Multiple commands produce 'Faun.app/Assets.car'
  15. OJ 1168 改写整数
  16. mac使用mysql出现的错误 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
  17. 坚果云 linux程序名称,备份Linux系统数据到坚果云
  18. Facebook广告投放的正确姿势:玩转目标定位
  19. 扫描仪CCC认证注意事项及标准依据
  20. watir安装及中文支持问题

热门文章

  1. 我会铭记这一天:2016年10月25日
  2. Ubuntu 14 开启SSH服务与使用root账号登陆
  3. mysql客户端工具的使用
  4. maven 构建 springmvc + spring security 权限控制示例
  5. 原创内容的17PK飞鸽传书
  6. 飞鸽传书技术更新换代非常快
  7. 飞鸽传书2007 一个自己开发的软件
  8. Windows 7 仅是Windows Vista SP2?
  9. Windows下C语言网络编程快速入门
  10. C++中用vectors改进内存的再分配