自定义信号槽机制

2023-11-08

如果想要在QT类中自定义信号槽, 需要满足一些条件, 并且有些事项也需要注意:

  1. 要编写新的类并且让其继承Qt的某些标准类
  2. 这个新的子类必须从QObject类或者是QObject子类进行派生
  3. 在定义类的头文件中加入 Q_OBJECT 宏
// 在头文件派生类的时候,首先像下面那样引入Q_OBJECT宏:
class MyMainWindow : public QWidget
{
    Q_OBJECT
    ......
}

自定义信号

  1. 信号是类的成员函数
  2. 返回值必须是 void 类型
  3. 信号的名字可以根据实际情况进行指定
  4. 参数可以随意指定, 信号也支持重载
  5. 信号需要使用 signals 关键字进行声明, 使用方法类似于public等关键字
  6. 信号函数只需要声明, 不需要定义(没有函数体实现)
  7. 在程序中发射自定义信号: 发送信号的本质就是调用信号函数
  8. 习惯性在信号函数前加关键字: emit, 但是可以省略不写
  9. emit只是显示的声明一下信号要被发射了, 没有特殊含义
  10. 底层 emit == #define emit
// 举例: 信号重载
// Qt中的类想要使用信号槽机制必须要从QObject类派生(直接或间接派生都可以)
class Test : public QObject
{
    Q_OBJECT
signals:
    void testsignal();
	// 参数的作用是数据传递, 谁调用信号函数谁就指定实参
	// 实参最终会被传递给槽函数
    void testsignal(int a);
};

自定义槽

  1. 返回值必须是 void 类型

  2. 槽也是函数, 因此也支持重载

  3. 槽函数需要指定多少个参数, 需要看连接的信号的参数个数

  4. 槽函数的参数是用来接收信号传递的数据的, 信号传递的数据就是信号的参数

  • 举例:
    信号函数: void testsig(int a, double b);
    槽函数: void testslot(int a, double b);
  • 总结:
    槽函数的参数应该和对应的信号的参数个数, 从左到右类型依次对应
    信号的参数可以大于等于槽函数的参数个数 == 信号传递的数据被忽略了
    信号函数: void testsig(int a, double b);
    槽函数: void testslot(int a);
  1. Qt中槽函数的类型是多样的
    Qt中的槽函数可以是类的成员函数、全局函数、静态函数、Lambda表达式(匿名函数)

  2. 槽函数可以使用关键字进行声明: slots (Qt5中slots可以省略不写)

  • public slots:
  • private slots: –> 这样的槽函数不能在类外部被调用
  • protected slots: –> 这样的槽函数不能在类外部被调用
// 槽函数书写格式举例
// 类中的这三个函数都可以作为槽函数来使用
class Test : public QObject
{
    public:
    void testSlot();
    static void testFunc();

    public slots:
    void testSlot(int id);
};

自定义信号和槽函数的使用

信号的参数主要是用于参数传递,传递到槽函数的参数里面去的。

先新建发射信号的类
在这里插入图片描述

在这里插入图片描述
继承QObject
(friend是关键字。。不能使用friend来命名类)
在这里插入图片描述
再新建一个接受信号的槽函数类:
在这里插入图片描述

信号类中定义的信号函数:
在这里插入图片描述
槽函数类中的槽函数声明:
在这里插入图片描述
槽函数定义:
在这里插入图片描述
将信号类和槽函数类在mainwindow中实例化。。并绑定
头文件中声明:
在这里插入图片描述
cpp中的定义
在这里插入图片描述

现在的关键问题是什么时候调用myFriend::sendMseeage信号函数,怎么调用myFriend::sendMseeage信号函数。

解决办法

在mainwindow中,在定义一个button按钮,发送信号,mainwindow接受信号,并调用myFriend::sendMseeage函数。

在这里插入图片描述

在这里插入图片描述
此时,button的click为信号函数,mainwindow中需要定义槽函数。

mainwindow代码如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "me.h"
#include "myfriend.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    //定义信号类和槽函数类的指针
    myFriend* myfriend;
    me* tom;
//槽函数
public slots:
    void receivebutton();  //槽函数声明(需要定义)

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

定义:

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

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{

    ui->setupUi(this);
    connect(ui->deleteWindow,&QPushButton::clicked,this,&MainWindow::close);
    //在mainwindow中将myfriend的信号函数和me的槽函数绑定 (关键在于自定义信号myFriend::sendMseeage的调用)
    myfriend = new myFriend(this);
    tom = new me(this);
    connect(myfriend,&myFriend::sendMseeage,tom,&me::receiveMessage);
    //再将button点击的信号函数和mainwindow中的receivebutton槽函数绑定
    connect(ui->sendMessage,&QPushButton::clicked,this,&MainWindow::receivebutton);



}

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

void MainWindow::receivebutton()
{
    qDebug()<<"点击了一下";
    //调用信号函数&myFriend::sendMseeage (myFriend 指针得在头文件中定义,不让调用不了,尴尬。。)
    myfriend->sendMseeage();
}

做为button的槽函数(在槽函数中,调用myfriend的信号函数)
在这里插入图片描述

绑定:

    //再将button点击的信号函数和mainwindow中的receivebutton槽函数绑定
    connect(ui->sendMessage,&QPushButton::clicked,this,&MainWindow::receivebutton);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义信号槽机制 的相关文章

  • 使用带有 MSVC 2015 编译器的 QT Creator 5.8

    我是新来的C 和编程 我正在尝试做一个小项目 使用Qt and Qt Creator 我当时用的是MinGW compiler 但对于这个项目 我需要与MSVC compiler 因为我需要使用QtWebEngineWidgets I ha
  • Qt Creator 中的按钮是否有隐藏属性?

    Qt Creator 属性托盘中是否有按钮的隐藏属性 我想找到一个 但找不到 我需要禁用一些按钮并隐藏一些按钮 我应该使用属性托盘还是在构造函数中进行 稍后在用户事件中 它们将被启用并显示 有些控件在调色板上具有 可见性 属性 有些则没有
  • 使用 Qt 在 xoverlay 之上绘制

    我希望在使用 Xoverlay 渲染的视频流之上绘制一些 UI 我正在使用 gstreamer 播放视频并使用 xoverlay 在 xvimagesink 上渲染它 我的小部件继承自 QGLWidget 我希望使用 QPainter 绘制
  • QDomDocument 无法设置带有 标记的 HTML 文档的内容

    当我使用QDomDocument对于 HTML 内容 如果存在则无法设置内容在文档的开头 但实际上为什么 例如 考虑以下代码片段 QDomDocument doc QString content a href bar foo a qDebu
  • 如何删除在设计器模式下创建的插槽?

    我已经创建了按钮cancelButton 然后我创建了函数槽on cancelButton clicked 使用上下文菜单项Go to slot 但是 过了一段时间 我删除了这个按钮 不再需要 并尝试删除该函数 但编译器给出错误undefi
  • 一个阻塞但非模态的 QDialog?

    我有一堆图像 我想对其执行一些操作 处理完每个图像后 我的程序应该弹出一个对话框 提示用户是否要继续处理下一个图像或中止 在此之前 他们应该有机会对图像或参数进行一些手动更改 无论如何 他们必须能够访问应用程序的窗口 而调用对话框的方法的执
  • 如何找到 QDockWidget 标题栏的高度?

    我正在尝试找到 a 的高度QDockWidget标题栏 以便对自定义布局进行一些智能调整大小 但标题栏不是单独的小部件 它内置于停靠小部件的私有布局中 并且没有成员可以访问它 还有其他方法可以找到它的高度吗 是的 您可以使用以下命令找到标题
  • 关于 GUI 计时器显示后台线程已用时间的建议?

    Issue 我有一个 PyQt GUI 用户按下按钮即可启动后台线程 workerThread 它是从QThread 我想要一个计时器显示 以QLabel 显示自此以来已经过去了多少时间workerThread开始 我希望这个计时器在wor
  • Qt、PushButton、id 属性?有什么方法可以知道点击了哪个按钮

    void MainWindow addRadioToUI int button cunter 4 while database isEmpty button cunter QPushButton one new QPushButton Pl
  • Qt + win32 + mingw 上的原生 Windows API 链接问题

    我正在尝试使用 mingw 工具集将本机 Windows API 与 Qt 结合使用 部分功能存在链接问题 会发生什么 这是 mingw 名称修改的错误吗 ifdef Q WS WIN HWND hwnd QWidget winId HDC
  • QT 中的应用程序->处理消息?

    在 Borland 6 中 我经常使用它来解除程序操作的卡住 Application gt Processmessages 现在 对于 QT 4 8 1 我在这个外国 对我来说 QT 文档中找不到 谁能帮我 在 Qt 中 您可以使用静态函数
  • [本机]:在Qt for Android中使用Java函数和第3方库[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 最近我用qt写了一个android应用程序 但我有一个很大的问题 我可以使用 调用一些原生的android API 比如调用特殊的activit
  • Qt 支持在 QIcon 中为 SVG 着色

    看来 Qt 不支持 SVG 中路径标签上的描边 填充选项
  • 在 QtCreator 中将 OpenCV 2.3 与 Qt 结合使用

    随着 OpenCV 2 3 版本终于发布 我想在我的系统上编译并安装这个最新版本 由于我经常使用 Qt 和 QtCreator 我当然希望能够在我的 Qt 项目中使用它 我已经尝试了几种方法几个小时 但总是出现错误 第一次尝试 使用WITH
  • 仅将非模态 QDialog 窗口放置在我的应用程序顶部,而不是所有应用程序顶部

    我有一个 QDialog 窗口 它应该始终位于我的应用程序顶部 它不是模态的 用户可以随时与对话框和主应用程序进行交互 使用窗口保持在顶部提示在某种程度上实现了这一点 但是 该对话框仍然位于所有其他正在运行的应用程序 例如记事本 chrom
  • 如何在 Qt-Embedded 中(正确)输出多语言文本?

    我的目标系统是 linux 3 3 7 Qt Embedded 开源版 4 8 Droid 字体 取自 fonts droid 20111207 git 1 all deb Debian 软件包并复制到 usr lib fonts目录 主要
  • 使用 cmake 将两种解决方案合二为一

    我有两个单独的 Visual Studio 2013 解决方案 我想将它们迁移到一个解决方案中 因为第一个解决方案 使用 Qt 充当第二个解决方案的 GUI 最后 我希望有一个结构如下的单一解决方案 Solution All Build P
  • 如何在按下托盘图标菜单操作时执行功能?

    int main int argc char argv QApplication oApp argc argv QAction action1 QMenu menu QSystemTrayIcon TrayIcon QIcon favico
  • Qt Creator:如何区分 win32 和 win64

    我必须在 pro 文件中执行类似的操作 win32 LIBS L 3rdparty libusb win32 lib msvc llibusb else win64 LIBS L 3rdparty libusb win32 lib msvc
  • Qt mouseReleaseEvent() 未触发?

    我有一个显示图片的库 我们称之为 PictureGLWidget 其中 class PictureGLWidget public QGLWidget 所以 PictureGLWidget 扩展了 QGLWidget 在PictureGlWi

随机推荐

  • C# webBrowser

    webBrowser功能 10 屏蔽脚本错误 将WebBrowser控件ScriptErrorsSuppressed设置为True即可 webBrowser1 ScriptErrorsSuppressed true HtmlElementC
  • ubuntu制作开机自启动service

    我们在使用java时 常常需要把jar包设置为开机自启动 保证机器在断电重启后仍然能正常的执行jar提供的服务 在部署再ubuntu系统中的操作过程如下 1 上传jar到指定的路径下 如上传到 home test jarTest test
  • Markdown操作——代码块内如何添加代码块+如何引用代码块符号

    目录 例子 尝试 用途 例子 以引用Markdown的数学公式为例 预览 E mc 2 这是个数学公式 但是想打出源代码 比如说想介绍一下这个代码的使用 的时候却不知道该怎么操作了 其实有的人想到了 直接在外面再加上 那就可以了吧 备注 c
  • Mysql实战详解15:mysql错误Please use SHOW DDL to check it, and then recover or rollback it

    4644 129f3d45d0265000 100 64 106 105 3306 common counter ERR CODE TDDL 4644 ERR PENDING DDL JOB EXISTS Another DDL job 1
  • 重磅!中国网络空间安全协会发布《2020年中国网络安全产业统计报告》

    6月29日 中国网络空间安全协会 以下简称 协会 发布了 2020年中国网络安全产业统计报告 以下简称 报告 共有4000余人出席线上发布会 报告 对国内绝大多数具备网络安全技术和产品自有研发能力的网络安全企业进行了梳理 统计和分析 力图全
  • ASP.NET页面之间传值的五种常用方法

    1 使用QueryString变量 QueryString是一种非常简单的传值方式 他可以将传送的值显示在浏览器的地址栏中 如果是传递一个或多个安全性要求不高或是结构简单的数值时 可以使用这个方法 但是对于传递数组或对象的话 就不能用这个方
  • Linux下GDB中的 attach pid 如何使用?

    linux下使用gdb可以很好的跟踪代码 当然 让我觉得神奇的是它竟然能跟踪正在运行的进程 下面 我将用我的例子演示一下怎么使用的 第一步 获得正在运行的进程的进程号 ps ef grep lt 进程名 gt 我的就是 找到该进程的进程id
  • O(nlogn)在数组S中找存在相加可得到x的算法

    题目 设计一个运行时间为O nlogn 算法 给定n个整数的集合S和另一个整数x 该算法能确定S中是否存在两个和相加刚好为x 的元素 思想 O nlogn O n O nlogn O nlogn 就是快排的时间复杂度 O n 就是查找的时间
  • 因果推断学习笔记(一)

    在日常生活中 我们常常会用到因果推断 比如 你淋雨了 赶紧去洗澡 不然容易着凉 感冒 这里我们认为淋雨是感冒的因 通过原因 来推断可能得结果 我拉肚子了 可能是昨天海鲜吃多了 这里我们认为海鲜吃多了是拉肚子的因 并且通过拉肚子反推可能得原因
  • N皇后问题

    久闻N皇后问题在算法界的赫赫大名 今天晚上有空我也来试一下 ps 至于我的作业 哈哈哈 请读者自行领悟 一 问题描述 在n n格的棋盘上放置彼此不受攻击的n个皇后 按照国际象棋的规则 皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子 n
  • 工作组 文件服务器,工作组文件服务器

    工作组文件服务器 内容精选 换一换 媒体处理包括媒体素材的上传 下载 编目 节目转码和数据归档等工作 涉及音视频数据的存储 调用和管理 根据其业务特性对共享的文件系统有如下要求 媒体素材的视频码率高 文件规模大 要求文件系统容量大且易于扩展
  • 琢磨下python装饰器的例子

    首先得强调 python中的引用是无处不在的 建议先看引文再回来琢磨例子 简单概括装饰器 对象 装饰器名字 A 任意函数名字 B 装饰语句 A B 若执行函数B B 则可理解为 带有 A的语句可将函数B 被装饰函数 作为参数传入A 装饰器
  • 【转】英文论文审稿意见汇总

    转自 海岩秋沙 的QQ空间 以下是从一个朋友转载来的 关于英文投稿过程中编辑给出的意见 与大家一起分享 以下12点无轻重主次之分 每一点内容由总结性标题和代表性审稿人意见构成 1 目标和结果不清晰 It is noted that your
  • 亿流量大考(4):自研ES+HBase+纯内存的高性能毫秒级查询引擎

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 一 前情回顾 上篇文章 亿流量大考 3 不加机器 如何抗住每天百亿级高并发流量 聊了一下系统架构中 百亿流量级别高并发写入场景下 如何承载这种高并发写入 同时如何在高
  • 7款家用智能摄像头横评:小米、乐橙、TP-LINK、海康威视、360、智汀、华为

    相信很多人都买过家用监控摄像头 有的是为了及时查看家里的老人孩子的动态 有的是为了看家里宠物 遇到小偷时还能拍下面貌 但市场上五花八门的监控摄像头 各种功能让人看花了眼 于是呢 为了让大家更了解智能摄像头 今天我们来测下市面上比较靠前小米
  • games103——作业2

    实验二主要使用隐式积分法以及PBD法完成布料仿真 完整项目已上传至github 文章目录 基于物理的方法 弹簧系统 单个弹簧 多个弹簧 弹簧网络 结构化弹簧网络 Structured Spring Networks 非结构化弹簧网络 Uns
  • lua中的math类库

    Lua5 1中数学库的所有函数如下表 math pi 为圆周率常量 3 14159265358979323846 abs 取绝对值 math abs 15 15 acos 反余弦函数 math acos 0 5 1 04719755 asi
  • 编程语言发展简史

    编程语言发展简史 一 编程的起源 二 第一代计算机语言 机器语言 三 第二代计算机语言 汇编语言 四 第三代计算机语言 高级语言 2022年4月 TIOBE编程排行榜 https www tiobe com tiobe index 高级语言
  • 16进制换成10进制 c语言 单片机,单片机入门之三种进制的转换

    单片机使用的两大进制表示形式 十进制和十六进制 这里使用十进制的数据 这里使用十六进制的数据 十进制一般用于运算 表示形式就是直接写 例如上面的1701 十六进制一般用于配置单片机的寄存器 表示形式是在数字前面加0x 例如上面的0xC0 0
  • 自定义信号槽机制

    自定义信号槽机制 自定义信号 自定义槽 自定义信号和槽函数的使用 解决办法 如果想要在QT类中自定义信号槽 需要满足一些条件 并且有些事项也需要注意 要编写新的类并且让其继承Qt的某些标准类 这个新的子类必须从QObject类或者是QObj