当前位置: 首页 > news >正文

QT信号与槽实现方式

1、第一种实现方式

        在QT开发工具UI界面先拖入按钮,然后鼠标右键拖入按钮,点击选中槽,在页面选着需要的信号,然后OK,随即将会跳转到类的.cpp文件,(这种UI+代码结合的方式,会自动去绑定信号与槽)。

2、第二种实现方法

        纯代码实现

        2.1、在类的构造文件中绑定信号与槽

QObject::connect(sender,SIGNAL(signal()),receiver, SLOT(slot()));sender------发送信号的对象SIGNAL(signal())--------信号类型receiver-------接收者SLOT(slot())--------槽函数

         2.2、类.h头文件声明槽函数

        2.3、槽函数执行功能

         2.4、报错解决

出现QObject::connect: Parentheses expected,这个错是我自己粗心,但也不得不吐槽下qt的不合理设计,connect时槽函数忘记加括号也可以编译通过,而且connect忘记加括号的槽函数是可以接收到信号的,因为我的槽函数里面打印的东西确实有输出。有点坑。

在类中使用信号/槽时一定要加Q_OBJECT宏,signal和slots的参数要一样

槽函数加(): connect(toTopLayerAction, SIGNAL(triggered()), this, SLOT(slotLayerTop()));   // 正确

切记忘了():connect(toTopLayerAction, SIGNAL(triggered()), this, SLOT(slotLayerTop));      // 错误

3、第三种实现方法

3.1、使用Lambda表达式在构造函数中实现

QObject::connect(sender,&Sender::signal, [=]() {/* lambda body */ });

4、第四种方式 

        Qt 5中引入,允许使用函数指针直接 连接信号和槽,这种方式类型安全, 且可以利用IDE 的代码补全和错误检 查。
QObject::connect(sender,&Sender::signal, receiver,&Receiver::slot);

4.1、在构造函数中实现 

 5、自定义信号与槽 

        在Qt 中,自定义信号与槽是实现对象间通信的一种机制。信号和槽是 Qt 对象通信的核心特性,使得一个 对象能够在发生某种事件时通知其他对象。自定义信号与槽的实现步骤如下:
        1. 定义信号 :在 Qt 中,信号是 signals 关键字声明的类成员函数。它们不需要实现,只需声明。例
如:

class MyClass : public QObject {Q_OBJECT
public:MyClass();
signals:void mySignal(int value);
};
在上面的例子中, MyClass 有一个名为 mySignal 的信号,它带有一个整型参数。
        定义槽:槽可以是任何普通的成员函数,但通常在类定义中用 slots 关键字标识。槽 可以有返回类型, 也可以接受参数,但它们的参数类型需要与发出信号的参数类型匹配 。例如:
class MyClass : public QObject {Q_OBJECT
public slots:void mySlot(int value);
};
在这个例子中,我们定义了一个名为 mySlot 的槽,它接收一个整型参数。
        连接信号与槽:使用 QObject::connect 函数将信号与槽连接起来。当信号被发射时,连接到这个信号 的槽将被调用。
MyClass *myObject = new MyClass();
connect(myObject, SIGNAL(mySignal(int)), myObject, SLOT(mySlot(int)));
这行代码连接了 myObject mySignal 信号到同一个对象的 mySlot 槽。
        发射信号:使用 emit 关键字发射信号。当信号被发射时,所有连接到这个信号的槽都会被调用。
emit mySignal(123);
这将触发所有连接到 mySignal 的槽。
5.1、例1
#include "widget.h"
#include "ui_widget.h"
//widget.cpp
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//连接槽  ,触发对象和接收都是自己QObject::connect(this ,SIGNAL(mysignal()) ,this ,SLOT(myslot()));QObject::connect( this ,SIGNAL(mysignalparams(int)) ,this ,SLOT(myslotparams(int)) );emit mysignal();        //触发信号emit mysignalparams(999);   //触发带参数的信号
}Widget::~Widget()
{delete ui;
}void Widget::myslot()     //槽函数
{std::cout << "myslot" << std::endl;
}void Widget::myslotparams(int value)
{std::cout << "myslotparams ," << value << std::endl;qDebug() << "This is value = " << value;
}
//widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <iostream>
#include <QDebug>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();signals:            //自定义信号void mysignal();void mysignalparams(int value);public slots:       //自定义槽void myslot();void myslotparams(int value);private:Ui::Widget *ui;
};
#endif // WIDGET_H

       执行结果

5.2、例2

        创建两个类,比如SenderReceiverSender类将发出信号,而Receiver类将接收并处理这个信号。

// Sender.h  
#ifndef SENDER_H  
#define SENDER_H  #include <QObject>  class Sender : public QObject {  Q_OBJECT  
public:  explicit Sender(QObject *parent = nullptr);  signals:      void mySignal();      //信号public slots:  void emitSignal();  
};  #endif // SENDER_H
// Sender.cpp  
#include "Sender.h"  Sender::Sender(QObject *parent) : QObject(parent) {  
}  void Sender::emitSignal() {  emit mySignal();          //发送信号
}
// Receiver.h  
#ifndef RECEIVER_H  
#define RECEIVER_H  #include <QObject>  
#include <QDebug>  class Receiver : public QObject {  Q_OBJECT  
public:  explicit Receiver(QObject *parent = nullptr);  public slots:  void handleSignal();      //槽函数
};  #endif // RECEIVER_H
// Receiver.cpp  
#include "Receiver.h"  Receiver::Receiver(QObject *parent) : QObject(parent) {  
}  void Receiver::handleSignal() {  qDebug() << "Signal received!";  //槽函数
}
// main.cpp  
#include <QCoreApplication>  
#include "Sender.h"  
#include "Receiver.h"  int main(int argc, char *argv[]) {  QCoreApplication a(argc, argv);  Sender sender;  Receiver receiver;  //连接信号与槽QObject::connect(&sender, &Sender::mySignal, &receiver, &Receiver::handleSignal);  sender.emitSignal(); // 调用函数发送信号return a.exec();  
}

6、QDebug()

        QDebug 是 Qt 框架中用于输出调试信息的一个类。它提供了一种方便的方式来输出文本到标准输出(通 常是控制台),这对于调试 Qt 应用程序非常有用。 QDebug 类可以与 Qt 的信号和槽机制一起使用,使 得在响应各种事件时能够输出有用的调试信息。
        使用 QDebug 的一个典型方式是通过 qDebug() 函数,它返回一个 QDebug 对象。然后,可以使用流操 作符 << 来输出各种数据类型。例如:
qDebug() << "This is a debug message";
int value = 10;
qDebug() << "The value is" << value;
        当执行这些代码时,它们会在应用程序的控制台输出相应的文本。这对于检查程序的运行状态、变量的 值或者跟踪程序的执行流程非常有帮助。
        还可以使用 qDebug() 来输出自定义类型,只要为这些类型提供了适当的输出操作符重载。此外, Qt 还 提供了 qInfo() , qWarning() , qCritical() qFatal() 函数,用于输出不同级别的信息,分别用 于普通信息、警告、关键错误和致命错误。这有助于对日志信息进行级别划分,从而更好地控制输出内
容。

相关文章:

QT信号与槽实现方式

1、第一种实现方式 在QT开发工具UI界面先拖入按钮&#xff0c;然后鼠标右键拖入按钮&#xff0c;点击选中槽&#xff0c;在页面选着需要的信号&#xff0c;然后OK&#xff0c;随即将会跳转到类的.cpp文件&#xff0c;&#xff08;这种UI代码结合的方式&#xff0c;会自动去绑定…...

Yarn面试重点

文章目录 1. 简述Yarn集群的架构2. Yarn 的任务提交流程是怎样的&#xff1f;3. yarn的资源调度的三种模型 1. 简述Yarn集群的架构 YARN&#xff08;Yet Another Resource Negotiator&#xff09;是Hadoop 2.x引入的资源管理器&#xff0c;用于管理Hadoop集群中的资源和作业调…...

高速口光口通信

1.通过transceiver ip 设置好硬件连接配置 2.open example 用自己的模块替换掉tx和rx数据模块 3.大小端问题—— 4.配置gt收发器的rx的k码时候需要设置anybyte便于高效率接收。 5.开发数据产生模块和接收校验模块都需要使用TXUSRCLK2,但是TXUSRCLK线速度/内部数据位宽。——…...

python--剑指offer--15. 二进制中1的个数

编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位数为 ‘1’ 的个数&#xff08;也被称为 汉明重量).&#xff09;。 提示&#xff1a; 请注意&#xff0c;在某些语言&#xff08;如 Java&…...

uniapp h5 部署

uniapp 配置 服务器文件路径 打包文件结构 //nginx 配置 server {listen 8300;server_name bfqcwebsiteapp;charset utf-8;#允许跨域请求的域&#xff0c;* 代表所有add_header Access-Control-Allow-Origin *;#允许带上cookie请求add_header Access-Control-Allow-C…...

排序算法:快速排序(递归)

文章目录 一、创始人托尼霍尔的快速排序二、挖坑法三、前后指针法 所属专栏:C初阶 引言&#xff1a;这里所说的快速排序有三种&#xff0c;第一种是霍尔大佬自创的&#xff0c;还有一种叫做挖坑法&#xff0c;另外一种叫前后指针法 一、创始人托尼霍尔的快速排序 1.这里我们先…...

蓝桥杯每日一题(BFS)

1562 微博转发 开始思路错误点&#xff1a;在用拉链法保存关注信息的时候&#xff0c;因为要看一个用户发的有多少转发的&#xff0c;所以要以用户为坑位&#xff0c;所有关注这个坑位的用户为链表。&#xff08;开始弄反了&#xff09; e数组存某个用户的idx&#xff0c;ne是…...

【C语言】linux内核pci_save_state

一、中文注释 //include\linux\pci.h /* 电源管理相关的例程 */ int pci_save_state(struct pci_dev *dev);//drivers\pci\pci.c /*** pci_save_state - 在挂起前保存PCI设备的配置空间* dev: - 我们正在处理的PCI设备*/ int pci_save_state(struct pci_dev *dev) {int i;/* X…...

轻松打造完美原型:9款在线工具推荐

早年&#xff0c;UI设计师选择的工具有限&#xff0c;功能相对单一&#xff0c;大多数在线原型设计工具都是国外的&#xff0c;语言和网络都增加了设计工作的负担。如今&#xff0c;国内外有许多在线原型设计工具&#xff0c;不仅可以在浏览器上使用&#xff0c;而且还具有团队…...

Vue3中Pinia状态管理库学习笔记

pinia的基本使用 <template><div><h2>Home View</h2> <h2>count:{{ counterStore.count }}</h2><h2>count:{{ count }}</h2><button click"increment">count1</button></div> </template>…...

共谋企业出海新篇章纷享销客荣获数字中国企业峰会“卓越成果奖”

3月9日&#xff0c;2024数字中国企业峰会在杭州西湖中维香溢大酒店成功举办&#xff0c;众多数字化领域专家、知名企业 CIO 代表到场。峰会旨在推动数字化转型与创新发展&#xff0c;为企业出海和国际合作搭建交流与合作的平台。本次峰会的颁奖环节&#xff0c;纷享销客凭借其卓…...

【MySQL】group_concat 函数和 locate 函数运用之找到每篇文章的主题

力扣题 1、题目地址 2199. 找到每篇文章的主题 2、模拟表 表&#xff1a;Keywords Column NameTypetopic_idintwordvarchar (topic_id, word) 是该表的主键&#xff08;具有唯一值的列的组合&#xff09;。该表的每一行都包含一个主题的 id 和一个用于表达该主题的词。可…...

RedisCluster集群中的插槽为什么是16384个?

RedisCluster集群中的插槽为什么是16384个&#xff1f; CRC16的算法原理。 1.根据CRC16的标准选择初值CRCIn的值2.将数据的第一个字节与CRCIn高8位异或3.判断最高位&#xff0c;若该位为0左移一位&#xff0c;若为1左移一位再与多项式Hex码异或4.重复3至9位全部移位计算结束5…...

一直出现问题,发现服务器磁盘空间已满导致,腾出服务器磁盘空间命令

要解决服务器磁盘空间已满的问题&#xff0c;你可以按照以下步骤操作&#xff1a; 查看磁盘使用情况&#xff1a;使用df -h&#xff0c; du -s -h ./*命令来查看服务器的磁盘空间使用情况。查找大文件&#xff1a;使用du -a | sort -rn | head -5命令来找出占用空间最大的前5个…...

吴恩达机器学习笔记 二十三 倾斜数据集的误差指标 精确率 召回率 精确率与召回率的平衡 F1分数

如果数据集的正例和反例的比例非常倾斜&#xff0c;常用的错误指标如 准确率(accuracy) 并不好用。此时可以用精确率和召回率。 精确率&#xff08;precision&#xff09;&#xff1a;真阳的样本数/预测为阳的样本数真阳数/&#xff08;真阳假阳&#xff09; 召回率(recall):…...

无人游艇的研发和开发对于多个领域具有重要

无人游艇的研发和开发对于多个领域具有重要性。 首先&#xff0c;无人游艇可以在海上进行各种任务&#xff0c;如海洋科学研究、资源勘探和监测、海洋环境保护等。相比传统的人工操作船只&#xff0c;无人游艇可以长时间在海上工作&#xff0c;可以自动化执行任务&#xff0c;…...

在AI创业热潮下,如何抓住AI赚钱机会,实现人生逆袭

随着人工智能技术的迅猛发展,AI创业热潮正席卷全球。这不仅为科技领域的专业人士提供了无限的商机,也为普通人开辟了全新的赚钱途径。本文将为您揭示在AI创业热潮下,普通人如何抓住AI赚钱机会,实现人生逆袭,同时探讨哪些行业适合应用AI技术。 一、普通人如何抓住AI赚钱机…...

JETSON 配置并跑通 NanoDet

JETSON 配置 NanoDet 文章目录 JETSON 配置 NanoDetNanoDet 介绍源码环境搭建及测试配置 NanoDet 的环境环境配置过程中遇到的问题&#xff1a;环境配置完毕验证 NanoDet NanoDet 介绍 可以参考这个博客&#xff1a;NanoDet&#xff1a;这是个小于4M超轻量目标检测模型 源码 …...

突破编程_C++_C++11新特性(unordered_multimap)

1 概述 std::unordered_multimap 是一个哈希表实现的无序容器&#xff0c;它存储的元素是键值对&#xff0c;并且允许键的重复。这意味着同一个键可以关联多个值。在 std::unordered_multimap 中&#xff0c;元素的插入顺序是不确定的&#xff0c;并且不会因为元素的插入、删除…...

15.WEB渗透测试--Kali Linux(三)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;14.WEB渗透测试--Kali Linux&#xff08;二&#xff09;-CSDN博客 Kali工具使用 3389远…...

5大场景重构AI协作流程:Awesome Claude Skills实战指南

5大场景重构AI协作流程&#xff1a;Awesome Claude Skills实战指南 【免费下载链接】awesome-claude-skills A curated list of awesome Claude Skills, resources, and tools for customizing Claude AI workflows 项目地址: https://gitcode.com/GitHub_Trending/aw/awesom…...

Windows 10/11防火墙设置:如何快速开启ICMP协议实现Ping功能(详细图文)

Windows系统ICMP协议配置全指南&#xff1a;从基础原理到高阶应用 在IT运维和开发工作中&#xff0c;网络连通性测试是最基础却又最频繁的需求之一。想象一下这样的场景&#xff1a;你正在部署一个关键服务&#xff0c;却发现客户端无法连接到服务器&#xff1b;或是远程协助同…...

vLLM-v0.17.1效果展示:多模型并发下99%请求延迟<500ms

vLLM-v0.17.1效果展示&#xff1a;多模型并发下99%请求延迟<500ms 1. vLLM框架核心能力 vLLM是一个专为大型语言模型(LLM)设计的高性能推理和服务库&#xff0c;其最新版本v0.17.1在多模型并发场景下实现了99%请求延迟低于500ms的惊人表现。这个最初由加州大学伯克利分校天…...

造相Z-Image文生图模型快速试用:10秒生成高清图片,简单易用

造相Z-Image文生图模型快速试用&#xff1a;10秒生成高清图片&#xff0c;简单易用 1. 快速体验&#xff1a;10秒生成你的第一张AI画作 1.1 一键部署模型 在CSDN星图镜像市场找到"造相 Z-Image 文生图模型&#xff08;内置模型版&#xff09;v2"镜像&#xff0c;点…...

保姆级教程:在PVE上5分钟搞定一个Ubuntu LXC容器,并配置好Docker环境

5分钟极速部署&#xff1a;PVE上Ubuntu LXC容器与Docker环境全自动配置指南 刚接触家庭服务器的朋友往往被复杂的虚拟化环境劝退。今天分享的这套方案&#xff0c;能让你在PVE平台上用不到5分钟时间&#xff0c;快速获得一个开箱即用的Ubuntu容器&#xff0c;并预装好Docker环境…...

GORM实战避坑指南:从‘小白’到‘老鸟’必须知道的10个细节(含MySQL连接配置)

GORM实战避坑指南&#xff1a;从‘小白’到‘老鸟’必须知道的10个细节&#xff08;含MySQL连接配置&#xff09; 1. MySQL连接配置的隐藏陷阱 charsetutf8mb4的必要性 MySQL默认的utf8编码只支持最多3字节的字符&#xff0c;而emoji表情等特殊字符需要4字节存储。若不指定utf8…...

AsyncAPI消息模式匹配:基于内容路由消息的终极指南

AsyncAPI消息模式匹配&#xff1a;基于内容路由消息的终极指南 【免费下载链接】spec The AsyncAPI specification allows you to create machine-readable definitions of your asynchronous APIs. 项目地址: https://gitcode.com/gh_mirrors/spec/spec AsyncAPI规范允…...

CGAL::Point_set_3 成员函数自查表

参考来源&#xff1a; CGAL 6.1.1 - 3D Point Set: CGAL::Point_set_3< Point, Vector > Class Template Reference 一、基础构造 / 容量 返回值函数名作用小 demoPoint_set_3()构造空点集Point_set ps;size_tnumber_of_points()获取点数auto n ps.number_of_points(…...

别再傻傻用远程桌面了!手把手教你用华为服务器自带的KVM工具(附初始IP和密码)

华为服务器KVM工具实战指南&#xff1a;解锁高效运维新姿势 第一次接触华为服务器时&#xff0c;我和大多数运维新手一样&#xff0c;本能地打开远程桌面连接工具&#xff0c;输入IP地址准备登录。直到某次机房网络故障&#xff0c;我才发现华为早已在服务器中内置了一把"…...

RLT火了,但拧螺丝的真问题真是它解决的吗?

先说结论RLT的核心价值在于“分工”&#xff1a;让笨重但泛化好的VLA做感知和粗规划&#xff0c;让轻快但专精的小网络做在线微调&#xff0c;这是一种计算和样本成本的折中架构。它没有解决数据收集的根本成本&#xff0c;而是优化了“数据利用率”和“策略更新效率”&#xf…...