信号和槽函数的扩展

2023-11-09

一个信号可以连接多个槽函数, 发送一个信号有多个处理动作

  • 需要写多个connect()连接
  • 槽函数的执行顺序和信号的发射顺序相同(QT5中)
  • 信号的接收者可以是一个对象, 也可以是多个对象

一个槽函数可以连接多个信号, 多个不同的信号, 处理动作是相同的

  • 需要写多个connect()连接

信号可以连接信号

  • 信号接收者可以不处理接收的信号, 而是继续发射新的信号,这相当于传递了数据, 并没有对数据进行处理

一个信号连接多个槽函数

信号函数类

#ifndef ME_H
#define ME_H

#include <QObject>

class me : public QObject
{
    Q_OBJECT
public:
    explicit me(QObject *parent = nullptr);

signals:
    void sendMessage();   //信号函数不需要定义

};

#endif // ME_H

槽函数类:

#ifndef MEPARENT_H
#define MEPARENT_H

#include <QObject>

class meParent : public QObject
{
    Q_OBJECT
public:
    explicit meParent(QObject *parent = nullptr);

public slots:
    void receiveMessage();

};

#endif // MEPARENT_H

#include "meparent.h"
#include "QDebug"

meParent::meParent(QObject *parent) : QObject(parent)
{

}

void meParent::receiveMessage()
{
    qDebug()<<"父母接受到消息";
}

#ifndef MYFRIEND_H
#define MYFRIEND_H

#include <QObject>

class myFriend : public QObject
{
    Q_OBJECT
public:
    explicit myFriend(QObject *parent = nullptr);

public slots:
    void receiveMessage();

};

#endif // MYFRIEND_H

#include "myfriend.h"
#include "QDebug"
myFriend::myFriend(QObject *parent) : QObject(parent)
{

}

void myFriend::receiveMessage()
{
    qDebug()<<"朋友接受到消息";
}

#ifndef MYTEACHER_H
#define MYTEACHER_H

#include <QObject>

class myTeacher : public QObject
{
    Q_OBJECT
public:
    explicit myTeacher(QObject *parent = nullptr);

public slots:
    void receiveMessage();

};

#endif // MYTEACHER_H

#include "myteacher.h"
#include "QDebug"
myTeacher::myTeacher(QObject *parent) : QObject(parent)
{

}

void myTeacher::receiveMessage()
{
    qDebug()<<"老师接受到消息";
}

主窗口中,槽函数和类指针的声明

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include"me.h"
#include"meparent.h"
#include "myfriend.h"
#include "myteacher.h"
#include "ouyang.h"
#include "shinecoln.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    me* tom;
    meParent* myparent;
    myFriend* myfriend;
    myTeacher* myteacher;
    ouyang* ou;
    shinecoln* shine;
//接受按钮信号的槽函数
public slots:
    void sendMessage();


private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

cpp文件如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QDebug"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    tom = new me(this);
    myparent = new meParent(this);
    myfriend = new myFriend(this);
    myteacher = new myTeacher(this);
    ou = new ouyang(this);
    shine = new shinecoln(this);
    //按钮绑定mainwindow的槽函数
    connect(ui->myPushButton,&QPushButton::clicked,this,&MainWindow::sendMessage);
    connect(tom,&me::sendMessage,myfriend,&myFriend::receiveMessage);
    connect(tom,&me::sendMessage,myparent,&meParent::receiveMessage);
    connect(tom,&me::sendMessage,myteacher,&myTeacher::receiveMessage);

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::sendMessage()
{
    //qDebug()<<"hello";
    tom->sendMessage();
}


消息传递的流程:点击控件,触发主窗口的槽函数。主窗口槽函数调用tom->sendMessage();信号函数,myfriend,myfriend,myfriend同时捕获到信号,按照顺序调用myFriend::receiveMessage meParent::receiveMessage myTeacher::receiveMessage这三个槽函数。
在这里插入图片描述

一个槽函数连接多个信号

信号类:

#ifndef ME_H
#define ME_H

#include <QObject>

class me : public QObject
{
    Q_OBJECT
public:
    explicit me(QObject *parent = nullptr);

signals:
    void sendMessage();   //信号函数不需要定义
    void sendMsg2(QString);

};

#endif // ME_H

#ifndef OUYANG_H
#define OUYANG_H

#include <QObject>

class ouyang : public QObject
{
    Q_OBJECT
public:
    explicit ouyang(QObject *parent = nullptr);

signals:
    void sendMessage();  //信号函数不需要定义
    void sendMsg2(QString);
};

#endif // OUYANG_H


#ifndef SHINECOLN_H
#define SHINECOLN_H

#include <QObject>

class shinecoln : public QObject
{
    Q_OBJECT
public:
    explicit shinecoln(QObject *parent = nullptr);

signals:
    void sendMessage();  //信号函数不需要定义
    void sendMsg2(QString);
};

#endif // SHINECOLN_H

槽函数类:

#ifndef MEPARENT_H
#define MEPARENT_H

#include <QObject>

class meParent : public QObject
{
    Q_OBJECT
public:
    explicit meParent(QObject *parent = nullptr);

public slots:
    void receiveMessage();
    void receiveMsg2(QString msg);

};

#endif // MEPARENT_H

#include "meparent.h"
#include "QDebug"

meParent::meParent(QObject *parent) : QObject(parent)
{

}

void meParent::receiveMessage()
{
    qDebug()<<"父母接受到消息";
}

void meParent::receiveMsg2(QString msg)
{
    qDebug()<<"父母接受到: "<<msg;
}

ui页面:
在这里插入图片描述

头文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include"me.h"
#include"meparent.h"
#include "myfriend.h"
#include "myteacher.h"
#include "ouyang.h"
#include "shinecoln.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    me* tom;
    meParent* myparent;
    myFriend* myfriend;
    myTeacher* myteacher;
    ouyang* ou;
    shinecoln* shine;
//接受按钮信号的槽函数
public slots:
    void sendMessage();
    void sendMsg2();
    void sendMsg3();
    void sendMsg4();


private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

cpp文件:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QDebug"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    tom = new me(this);
    myparent = new meParent(this);
    myfriend = new myFriend(this);
    myteacher = new myTeacher(this);
    ou = new ouyang(this);
    shine = new shinecoln(this);
    //一个信号绑定多个槽函数
    //按钮绑定mainwindow的槽函数
    connect(ui->myPushButton,&QPushButton::clicked,this,&MainWindow::sendMessage);
    connect(tom,&me::sendMessage,myfriend,&myFriend::receiveMessage);
    connect(tom,&me::sendMessage,myparent,&meParent::receiveMessage);
    connect(tom,&me::sendMessage,myteacher,&myTeacher::receiveMessage);


    connect(ui->myPushButton2,&QPushButton::clicked,this,&MainWindow::sendMsg2);
    connect(ui->myPushButton3,&QPushButton::clicked,this,&MainWindow::sendMsg3);
    connect(ui->myPushButton4,&QPushButton::clicked,this,&MainWindow::sendMsg4);
    //一个槽函数绑定多个信号
    connect(tom,&me::sendMsg2,myparent,&meParent::receiveMsg2);
    connect(ou,&ouyang::sendMsg2,myparent,&meParent::receiveMsg2);
    connect(shine,&shinecoln::sendMsg2,myparent,&meParent::receiveMsg2);

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::sendMessage()
{
    //qDebug()<<"hello";
    tom->sendMessage();
}

void MainWindow::sendMsg2()
{
    QString s = "tom";
    tom->sendMsg2(s);
}

void MainWindow::sendMsg3()
{
    QString s = "ou";
    ou->sendMsg2(s);
}

void MainWindow::sendMsg4()
{
    QString s = "shine";
    shine->sendMsg2(s);
}


关键代码:
在这里插入图片描述
在这里插入图片描述

运行:
在这里插入图片描述

信号连接信号

信号接收者可以不处理接收的信号, 而是继续发射新的信号,这相当于传递了数据, 并没有对数据进行处理
槽函数的位置不对信号处理,而是对信号的转发。

connect(const QObject *sender, &QObject::signal,  const QObject *receiver, &QObject::siganl-new);

例子:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QDebug"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    tom = new me(this);
    myparent = new meParent(this);
    myfriend = new myFriend(this);
    myteacher = new myTeacher(this);
    ou = new ouyang(this);
    shine = new shinecoln(this);
    //一个信号绑定多个槽函数
    //按钮绑定mainwindow的槽函数
    connect(ui->myPushButton,&QPushButton::clicked,this,&MainWindow::sendMessage);
    connect(tom,&me::sendMessage,myfriend,&myFriend::receiveMessage);
    connect(tom,&me::sendMessage,myparent,&meParent::receiveMessage);
    connect(tom,&me::sendMessage,myteacher,&myTeacher::receiveMessage);


    connect(ui->myPushButton2,&QPushButton::clicked,this,&MainWindow::sendMsg2);
    connect(ui->myPushButton3,&QPushButton::clicked,this,&MainWindow::sendMsg3);
    connect(ui->myPushButton4,&QPushButton::clicked,this,&MainWindow::sendMsg4);
    //一个槽函数绑定多个信号
    connect(tom,&me::sendMsg2,myparent,&meParent::receiveMsg2);
    connect(ou,&ouyang::sendMsg2,myparent,&meParent::receiveMsg2);
    connect(shine,&shinecoln::sendMsg2,myparent,&meParent::receiveMsg2);

    //信号连接信号
    connect(ui->myPushButton5,&QPushButton::clicked,tom,&me::sendMessage);

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::sendMessage()
{
    //qDebug()<<"hello";
    tom->sendMessage();
}

void MainWindow::sendMsg2()
{
    QString s = "tom";
    tom->sendMsg2(s);
}

void MainWindow::sendMsg3()
{
    QString s = "ou";
    ou->sendMsg2(s);
}

void MainWindow::sendMsg4()
{
    QString s = "shine";
    shine->sendMsg2(s);
}


在这里插入图片描述
新建的是 myPushButton5 按钮:

    //信号连接信号
    connect(ui->myPushButton5,&QPushButton::clicked,tom,&me::sendMessage);

信号连接信号(之前都是在mainwindow中建立了槽函数,然后槽函数发送信号)

现在就直接点击按钮,发送信号,然后触发第二个信号me::sendMessage

之前的代码捕获到信号

运行结果为:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

信号和槽函数的扩展 的相关文章

  • QtCreator 调试暂停停在代码而不是汇编处

    如何配置 QtCreator 以便在调试并按下暂停时它会显示当前正在处理的代码 现在显示汇编 无法在任何地方找到有关此问题的答案 我使用的是 Windows 7 我在 Ubuntu 16 04 中使用 Qt Creator 4 2 2 时遇
  • Qt WinRT 应用程序无法访问文件权限被拒绝

    我需要使用 Qt 和 FFMPEG 开发 WinRT 应用程序 我根据指令构建了 WinRT 的 ffmpeghere https github com Microsoft FFmpegInterop我可以将库与我的项目链接起来 现在我需要
  • Qt - 如何粘合两个窗口并将它们移动在一起?

    就像qmmp Qt 音乐播放器ui设计一样 这两个或三个窗口实际上在同一个窗口中 因为只有一个dock图标 并且这些窗口可以一起移动并相互附着 我看了源码 好像有用QDockWidget 但我真的不知道如何获得它的细节 当您手动移动辅助窗口
  • 如何将图像显示为缩略图

    我有一个QTreeView显示硬盘驱动器和目录 我也有一个QListView显示图像文件如下 但我想将图像显示为缩略图 如下所示 My code mainWidget mainWidget QWidget parent QWidget pa
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • 如何获取 QTableView 的标题列表?

    我有一个QTableView我的对话框中的对象 我需要访问该表的水平标题并将它们放入QStringList object 尽管进行了大量搜索 但我在 Qt 文档中找不到如何获取此标头列表 编辑 我发现的最接近的地方是this https w
  • QTimer 一点也不准确?

    运行在 Windows7 64 位机器上 具有非常强大的 CPU 8 核 16 线程 我使用 QTimer 以 50Hz 触发函数调用 但我最终得到了 30Hz 函数调用本身肯定需要不到 10 毫秒才能完成 整个过程发生在一个单独的线程中
  • 在 MacOS 终端上运行 ffmpeg [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我对 MacOS 相当陌生 我发现使用终端来获取信息并不容易ffmpeg和我在 Window 上一样正常运行 我有 ffmpeg 二进制文件ffmpe
  • 将 gnuplot 嵌入现有 QtWidget 中

    我正在用 C 创建一个 伪 实时绘图应用程序 使用 gnuplot 作为绘图后端 我的要求之一是绘图必须位于现有窗口内 而不是有一个单独的绘图窗口 gnuplot 默认为 Gnuplot 有一个选项可以指定 Qt 小部件 ID 这似乎适合我
  • Qt - 无法让 lambda 工作[重复]

    这个问题在这里已经有答案了 我有以下功能 我想在其中修剪我的std set
  • 从 Qt4 中的文本文件中逐字读取

    我想在 Qt4 中逐字读取一个文本文件 说实话我对它很陌生 我想在另一个文件中每行一个字写入 我可以在 C 中做到这一点 没有任何问题 但是当我尝试在 Qt4 中使用 ifstream 和 ofstream 时 我遇到了错误 这是我的 Qt
  • Qt 是否已经有了自己的 new 和 delete 运算符?

    我正在使用一个QGraphicsScene小部件并在其上显示一些点QGraphicsRectItem 这意味着要拨打很多电话new addItem 当出现时 并且removeItem delete摆脱未使用的点 当然 对于性能问题 我已经实
  • Qt 5.3 无法使 QCompass (QSensor) 在 Windows 8.1 上工作

    我无法让传感器在我的 Asus Transformer T100 上工作 磁力计和指南针无法启动 并且我从加速度计获得假值 始终 x 0 y 9 8 z 0 即使使用我的笔记本电脑 我总是得到相同的结果 第一段文字编辑 Initialisa
  • 如何为 Windows 构建静态 Qt 库并将其与 Qt Creator 一起使用

    我已经下载了以下 Qt 源 http download qt nokia com qt source qt everywhere opensource src 4 7 3 zip http download qt nokia com qt
  • Mac 上的 Qt — 如何访问帮助菜单中的“搜索”

    我正在将我的 Qt 应用程序移植到 Mac OS X 在 Windows Linux 上 我使用 QLineEdit 在帮助菜单中提供搜索功能 In Mac OS X I saw something like this is built i
  • 安装J语言的JQt IDE,出现错误

    我一直按照这里的说明进行操作 http code jsoftware com wiki System Installation Linux http code jsoftware com wiki System Installation L
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • 是否可以在 Qt Creator 中将 Qt 样式表与升级的小部件一起使用?

    我正在尝试使用 Qt 样式表对标准小部件进行一些重大的重新设计 因此 在为不同的小部件手动完成大部分工作之后 objectName选择器 我决定以某种方式对类似的小部件进行分组 例如我有多个QFrames其作用类似于内部表单中的标题 我希望
  • Qt 安装程序框架 - 如何在卸载时仅删除某些文件和文件夹

    我使用 Qt 安装程序框架 如何确保在卸载时仅删除某些文件或文件夹 而不是像当前那样删除安装文件夹中的所有文件 先感谢您 您可以覆盖默认行为component createOperations对于卸载程序 然后使用手动指定每个卸载路径com
  • 如何从 matlab 调用 Qtproject?

    我在 matlab 中有一个函数可以写入一个 file txt 我在 qt 项目中使用它 So 当我使用 unix 获取要运行的 qt 编译可执行文件时 我有一个 Matlab 文件 但出现错误 代码 unix home matt Desk

随机推荐

  • JAVA实现蛇形矩阵算法

    JAVA实现蛇形矩阵算法 蛇形矩阵是一种特殊的二维矩阵 其元素按照一定的规律排列成蛇形 这种算法可以通过JAVA编程语言来实现 本文将介绍如何使用JAVA编写代码来生成蛇形矩阵 并给出相应的源代码 蛇形矩阵的生成规则如下 第一行从左到右依次
  • 多租户系统设计

    多租户系统设计 SaaS 的系统分级 SaaS 系统架构成熟度模型的 5 个级别 从 混乱 到 乌托邦 第 0 级 混乱 每次新增一个客户 都会新增软件的一个实例 第 1 级 受控的混乱 所有客户都运行在软件的同一个版本上 而且任何的定制化
  • 当在浏览器中输入一个域名后,会发生什么

    今天 去哪儿网Geely老师分享了他在校招时的一个面试题 当输www qunar com时发生了什么 真不是做广告哈 因为学的并没有很扎实 不能更深更广的分析这个问题 遂 百度一下 发现这篇文章并转载保存下来 同时也分享一下 希望大家可以更
  • vue-cli3.0打包时如何忽略某个第三方依赖包

    前几天接到了用vue重构某个业务模块的需求 常规开发不做讨论 但是在打包时需要排除业务中使用的某个第三方依赖包 代码如下 main js import Vue from vue import Cesium from cesium Cesiu
  • 解决Win7启动时出现“windows未能启动。原因可能是最近更改了硬件或软件”的问题

    搜索资料的时候发现个小问题 问题描述 在给ThinkPad T490做win7系统时 出现了 windows未能启动 原因可能是最近更改了硬件或软件 的问题 一直启动不来 在系统盘微PE中甚至还会出现 0x490 找不到元素 的问题 如何来
  • cuda安装笔记

    更新2023 3 4 我笔记本用vs编译后老是提示no kernel image is available for execution on the device 一直以为是驱动版本太高了或者cudatoolkit版本太高了 后来才知道是版
  • 【数据挖掘】知识点总结

    一 绪论 什么是数据挖掘 就是通过算法从大量的数据中搜索隐藏在其中的信息 数据挖掘的基本任务 聚类分析 异常检测 关联分析和预测建模 高维性和维灾难 随着维度的增加计算复杂度也随之增加 二 数据 不同的属性类型 标称 例如 邮政编码 定性数
  • 大数据应用——Linux常用的命令

    帮助命令 1 基本语法 help 命令 功能描述 获得shell内置命令的帮助信息 2 案例实操 1 查看cd命令的帮助信息 root hadoop01 help cd 常用快捷键 常用快捷键 功能 ctrl c 停止进程 ctrl l 清
  • Python(十五)读取Excel

    今天来实战演示如何封装读取Excel方法 第一步 准备一个Excel文件 sheet页命名为 login 学习技术交流群 704807680 第二步 编写代码找到Excel文件所在的文件夹路径 path os path dirname os
  • 机器学习算法——混淆矩阵(Confusion Matrix)之鸢尾花实例

    一 理论 什么是混淆矩阵 其实就是把所有类别的预测结果与真实结果按类别放置到了同一个表里 在这个表里我们可以清楚地看到每个类别正确识别的数量和错误识别的数量 混淆矩阵在什么情况下最好呢 答案是类别不平衡时 混淆矩阵是除了ROC曲线和AUC之
  • chatGPT高考作文

    百花齐放 春满人间 吹灭别人的灯 并不会让自己更加光明 阻挡别人的路 也不会让自己行得更远 这是一句古老而智慧的话语 告诉我们要尊重和包容他人 要与人和睦相处 要共同进步 同样的道理 也适用于文化的交流和发展 文化是一个民族的灵魂 是一个国
  • 华为OD机试真题-不爱施肥的小布

    题目描述 某农场主管理了一大片果园 fields i 表示不同果林的面积 单位 m 2 现在要为所有的果林施肥且必须在n天之内完成 否则影响收成 小布是果林的工作人员 他每次选择一片果林进行施肥 且一片果林施肥完后当天不再进行施肥作业 假设
  • C++复合类型

    1 数组 数组声明应该指出元素类型 数组名和元素个数 数组的初始化需要遵循以下规则 a 只有定义数组时才能使用初始化 此后就不能使用了 也不能将一个数组赋给另一个数组 int narray1 4 1 2 3 4 int narray2 4
  • 操作系统 实验二 银行家算法

    题目描述 已知进程 P0 P1 P2 P3 P4 有三类系统资源A B C的数量分别为10 5 7 在T0时刻的资源分配情况如下图所示 1 若进程P1请求资源 发出请求向量Request1 1 0 2 编写程序用银行家算法判断系统能否将资源
  • 【javascript-基础小练习】角度转弧度,已知角度90,转成弧度?

    角转弧度的公式为 jiao 180 pai hu 假设pai的值为 3 14
  • 数据库的事务及变量声明方法

    事务 简单来说事务就是为了保持数据一致性的一种手段 在事务中的sql语句作为一个整体一起向系统提交 要么都执行 要么都不执行 可以回滚到原来的状态 事务的语法 开始事务 begin tran 或者transaction 提交事务 commi
  • Spring为什么不推荐你使用@Autowired ?

    Spring为什么不推荐你使用 Autowired 我们总能发现当使用IDEA写代码的时候 Autowired注解会报黄 我们把鼠标悬停在上面 可以看到这个如下图所示的警告信息 当我们按住alt 回车键 idea就会帮我们修改成这样 我向来
  • 微服务架构

    3 注册中心与服务发现 前言 1 服务发现基础知识 1 1 注册中心与服务发现的联系 1 2 使用 DNS 与负载均衡器发现服务的弊端 1 3 云中的服务发现应该具备的特点 1 4 服务发现架构 1 5 服务治理的概念 1 6 服务注册的概
  • Linux服务器(centos7)中Word转换PDF,文档出现中文乱码或方格【亲测可用,已解决】

    提示 在centos服务器使用aspose word转换word文件为pdf的时候只有中文乱码或则方格 但是在win服务器上使用可以正常转换 本次文章主要解决字体缺失问题 目录 前言 一 在linux服务器上生成的pdf都是这种格式的 二
  • 信号和槽函数的扩展

    信号和槽函数的扩展 一个信号连接多个槽函数 一个槽函数连接多个信号 信号连接信号 一个信号可以连接多个槽函数 发送一个信号有多个处理动作 需要写多个connect 连接 槽函数的执行顺序和信号的发射顺序相同 QT5中 信号的接收者可以是一个