七、Qt 信号和槽

在QT4以上的版本,在窗体上用可以通过选中控件,然后点击鼠标右键单击按钮,选择“转到槽”。可以自动创建信号和槽。

选择clicked(),并点击 ok

Qt Creator会给头文件和代码文件自动添加 这个按钮的单击事件(信号和槽)。

不同的控件,信号不全是一样的,根据控件的使用场景不同,包含的信号也不一样。比如下拉列表框的信号和按钮的不太一样,没有按钮的单击信号,只有选择信号

以上是用QT新版本的特性来创建信号和槽。比较方便。

下边我们来介绍自定义信号和槽的绑定。首先介绍connect函数:

connect(信号发送者对象, 信号, 信号接收者对象, 槽, 信号和槽之间的连接模式)

connect​​函数有5个参数,其中第五个参数为信号和槽的连接模式,此参数有默认模式=AutoConnection。

enum ConnectionType {

AutoConnection,

DirectConnection,

QueuedConnection,

BlockingQueuedConnection,

UniqueConnection = 0x80

};

AutoConnection:自动连接,默认模式。连接类型会在信号发送时决定。如果接收者和发送者在同一个线程,则自动使用Qt::DirectConnection类型;如果接收者和发送者不在一个线程,则自动使用Qt::QueuedConnection类型。 DirectConnection:直接连接,槽函数会在信号发送的时候直接被调用,槽函数和信号发送者在同一线程。效果看上去就像是在发送信号的位置调用了槽函数。无论槽函数所属对象在哪个线程,槽函数都在发射信号的线程内执行。 emit语句后面的代码将在与信号关联的所有槽函数执行完毕后才被执行。 QueuedConnection:队列连接,信号发出后会暂时被放到一个消息队列中,需等到接收对象所属线程的事件循环取得控制权时才取得该信号,然后执行和信号关联的槽函数,这种方式既可以在同一线程内传递消息也可以跨线程操作。 emit语句后的代码将在发出信号后立即被执行,无需等待槽函数执行完毕,槽函数在接收者所依附线程内执行。 BlockingQueuedConnection:槽函数的调用时机与Qt::QueuedConnection一致,区别在于发送者emit完信号后所在线程会阻塞,直到槽函数运行完毕。并且接收者和发送者绝对不能在一个线程,否则程序会死锁。在多线程间需要同步的场合可能需要这个。 Qt::UniqueConnection:这个flag可以通过按位或(|)与以上四个结合在一起使用。当这个flag设置时,当某个信号和槽已经连接时,再进行重复的连接就会失败。也就是为了避免重复连接。

以下拉列表框控件QCombobox举例,当下拉选项改变时,会触发相关的槽:

// QT4 信号和槽最常用也是最常见的连接方式为使用:

connect(ui->comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(currentIndexChanged(int))); connect(ui->comboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(currentIndexChanged(QString)));

以上代码需要写到窗体的构造函数里

然后需要在头文件中声明

currentIndexChanged(int index)

currentIndexChanged(QString text)

然后在代码文件中实现这两个函数

以上的写法是在Qt4中,使用SIGNAL和SLOT这两个宏,将信号和槽转成了字符串形式,是利用的字符串进行的匹配。如果信号和槽不匹配,编译工程时是不会报错的!

在Qt5版本中对信号和槽采用了新的方法:基于函数地址的强制类型转换或重载,如果信号和槽的形参不匹配,在编译时就会报错:

connect(ui->comboBox, QOverload::of(&QComboBox::currentIndexChanged), this, [=](int index){

QMessageBox::information(this, "index", QString::number(index));

});

connect(ui->comboBox, &QComboBox::currentTextChanged, this, [=](const QString &text){

QMessageBox::information(this, "text", text);

});

上边的定法中[]有以下三种用法,说明如下:

[] 空的捕获列表,不会捕获任何外部变更,也不能访问任何外部变量

connect(button,&QPushButton::clicked,[](){

qDebug()

});

[=] 拷贝,外部变量以值传递,不能修改外部变量的值

int nCount = 0;

[=] 所有 [nCount] [=nCount]

[&]引用,可以修改外部变量的值

int nCount = 0;

connect(button,&QPushButton::clicked,[&](){ //也可以写成[&nCount]

nCount ++;

qDebug()

});

​QOverload​​是QT5.7版本之后才加入的,

语法格式:​​QOverload::of(函数地址)​​

作用:返回指定参数的重载函数。

QT5中的信号和槽的连接使用模板:

connect(

发送者对象,

static_cast(&发送者类名::信号函数名),

this,

static_cast(&接收者类名::槽函数名)

);

connect(

发送者对象,

qOverload::of(&发送者类名::信号),

this,

qOverload::of(&接收者类名::槽)

);

QObject::connect(m_test, QOverload::of(&FunctionTest::valueChangedflag),m_data, &Dataprocess::SignalOutputFlag);

这行代码是用于在Qt中建立信号与槽的连接。信号valueChangedflag来自FunctionTest对象,它的参数类型是QString和bool。槽SignalOutputFlag来自Dataprocess对象。当valueChangedflag信号被触发时,会调用SignalOutputFlag槽函数。

该连接的作用是将FunctionTest的信号与Dataprocess的槽函数进行关联,以便在valueChangedflag信号触发时,通过调用SignalOutputFlag槽函数来处理相关逻辑。

请注意,根据代码上下文和实际需求,m_test和m_data应该是对象的指针或引用。此外,确保在连接信号与槽之前,FunctionTest和Dataprocess类都已正确定义和声明。

QOverload::of(&FunctionTest::valueChangedflag) 是一个用于获取成员函数指针的静态函数模板。

在这里,QOverload 是一个模板类,提供了多个静态成员函数 of,用于获取特定参数签名的成员函数指针。QString 和 bool 是参数类型。FunctionTest::valueChangedflag 是一个信号函数,它将被连接到槽函数。

通过使用 QOverload::of(&FunctionTest::valueChangedflag),可以在连接信号和槽时指定正确的参数类型,并确保信号函数与槽函数的参数匹配。

请注意, QOverload 类是 Qt 提供的用于信号和槽连接的辅助类,它提供了一种类型安全的方法来处理函数指针的重载问题。它允许在连接信号和槽时检查参数类型的一致性,以避免潜在的编译错误和运行时错误。

connect(comboBox, QOverload::of(&QComboBox::currentIndexChanged),[=](int index){

/* do ... */

});

《写在最前边》

《一、QT的前世今生》

《二、QT下载、安装及问题解决(windows系统)》


《三、Qt Creator使用》 ​​​

​​​​​​​《四、Qt 的第一个demo-CSDN博客》

《五、带登录窗体的demo》

《六、新建窗体时,几种窗体的区别》 

《七、Qt 信号和槽》 ​​​​​​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/622913.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Docker】centos中及自定义镜像,并且上传阿里云仓库可提供使用

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是平顶山大师,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《【Docker】centos中及自定义镜像,…

零零鸡生态养殖农场“出圈”,有“智”更有“质”,助力本土品牌高质量发展

什么是生态农场?不同于常规农场,它对农业生产经营单元的各个关键环节有着极为严格的要求,强调整体、协调、循环、再生、多样,产品质量自然更好,附加值也更高,更能满足日趋多样化的巨大市场。零零鸡生态农场…

C#调用WinAPI部分命令

C#是针对WIndows而生的,开发WIndows应用最快。然而想要让自己程序进阶,就不需深入Windows底层,WinAPI为我们提供了一把利刃。 目录 1、查找窗口句柄 2、查找窗口内子对象 3、指定窗口样式 4、指定窗口扩展样式 5、调整窗口大小Z轴&…

还在因为版本不一致重装node吗,用它试试

一、卸载nodejs 首先卸载已安装的nodejs,总体分三步 1)打开控制面板,卸载nodejs 2)打开计算机->高级->环境变量,删除path中nodejs相关的配置 3)打开nodejs安装目录,整体删除 打开cmd,输入以下命令&#xff…

为什么要进行漏洞扫描工作

随着互联网的普及和信息技术的飞速发展,网络安全问题愈发引人关注。其中,漏洞扫描作为保障网络安全的重要手段,受到了广泛的关注和应用。本文将详细介绍漏洞扫描的概念、效果、使用场景等,以期为读者提供有关漏洞扫描的全面了解。…

网络分流规则

现在的网络是越来越复杂。 有必要进行分流。 有一些geosite.dat是已经整理好的,包含许多的网站的分类: 分流规则: route规则 主要是: {"type": "field","outboundTag": "direct","domain&quo…

【Vue3】2-11 : 生命周期钩子函数及原理分析

本书目录:点击进入 一、组件生命周期概述 1.1 官方生命周期 1.2 钩子函数(回调函数) ▶ 生命周期可划分为三个部分(- >表示执行循序): 二、实战:测试生命周期流程 > 代码 > 效果 一…

在CMake中自定义宏 add_definitions(-DDEBUG)

hehedalinux:~/Linux/loveDBTeacher-v6$ tree . ├── CMakeLists.txt └── test.c0 directories, 2 files hehedalinux:~/Linux/loveDBTeacher-v6$ test.c #include <stdio.h> #define NUMBER 3int main() {int a 10; #ifdef DEBUGprintf("我是一个程序猿,我…

QT获取程序编译时间与当前时间的区别及应用场景

一.获取编译时间与当前时间的区别 1.编译日期时间&#xff1a;这个信息通常用于标识某个源代码文件或整个应用程序的编译时间&#xff0c;程序一旦编译出来不会再改变&#xff0c;通常用于记录或跟踪代码的版本和更改历史。 2.运行当前日期时间&#xff1a;这是指程序在运行时…

UG装配-多运动组合动画与自动创建装配路径

当圆盘在装配过程中既有旋转运动&#xff0c;又有直线运动的时候&#xff0c;我们需要用到序列中的抽取路径 抽取路径命令在如下位置&#xff0c;需要注意的是&#xff0c;使用抽取路径前&#xff0c;如果有其他零件与所取对象配合&#xff0c;需要先物体脱离或使用拆卸对其脱离…

【STM32F103】继电器的用法

前言 因为最近用到了继电器&#xff0c;所以稍微记录一下继电器的用法。 如果我们需要点亮一个LED灯的时候&#xff0c;我们只需要用单片机的GPIO口去输出高低电平驱动就行。 但是我们需要通过单片机去控制大电压器件的开关的时候&#xff0c;我们就不能简简单单地用一个GPI…

linux Tcp总结

Tcp连接建立时的影响因素 在Client发出SYN后&#xff0c;如果过了1秒 &#xff0c;还没有收到Server的响应&#xff0c;那么就会进行第一次重传&#xff1b;如果经过2s的时间还没有收到Server的响应&#xff0c;就会进行第二次重传&#xff1b;一直重传tcp_syn_retries次。 对…

策略模式-实践

俗话说&#xff1a;条条大路通罗马。在很多情况下&#xff0c;实现某个目标的途径不止一条&#xff0c;例如我们在外出 旅游时可以选择多种不同的出行方式&#xff0c;如骑自行车、坐汽车、坐火车或者坐飞机&#xff0c;可根据实 际情况&#xff08;目的地、旅游预算、旅游时间…

星河璀璨:飞桨星河文心SDK与Gurdance珠联璧合让大模型更像人!

星河璀璨&#xff1a;飞桨星河文心SDK与Gurdance珠联璧合让大模型更像人&#xff01; 本项目效果惊艳&#xff0c;可以在AIStudio星河社区一键运行 只需要在cpu基础版下运行&#xff0c;妈妈再也不怕我的算力不够了&#xff01; 1、引言 2023年8月22日&#xff0c;百度董事…

3.14.1 函数对象 Page139~141

28行&#xff0c;doggie是一个类型为Dog的对象&#xff0c;而“()”是它的一个成员函数&#xff0c;doggie()实际上是doggie.operator() "operator()"既然是函数&#xff0c;那就可以有参数&#xff0c;也可以有返回值 运行结果为&#xff1a;

新微信公众号没有留言功能, 你们怎么破?

为什么公众号没有留言功能&#xff1f;从2018年2月开始&#xff0c;新注册的微信公众号取消了留言功能&#xff0c;原因是为了规避一些营销号通过虚假留言骗取读者信任。不过大部分公众号运营者对TX此举感到失望&#xff0c;一方面大片的留言就像店前排队的顾客&#xff0c;能体…

PLC、工业设备如何远程访问?贝锐蒲公英云智慧组网实现数据互通

在工业4.0时代&#xff0c;工业数字化的核心在于数据的互联互通&#xff0c;而在整个工业数字化、智能化的过程中&#xff0c;往往面临数据采集困难、设备运行情况难以知晓、部署管理难度大、后期维护成本高等问题。 显然&#xff0c;PLC设备在整个工业数字化进程中扮演的角色…

freertos任务管理器,任务监控

freertos提供了类似于windows的任务管理器功能&#xff0c;具体地如下&#xff1a; 1、configUSE_TRACE_FACILITY 和 configUSE_TRACE_FACILITY使能置1 2、调用vTaskList&#xff0c;如下&#xff1a; if(idleTaskCounter%84){char printlist[2048];vTaskList(printlist);Prin…

ssm基于Java的药店药品信息管理系统的设计与实现论文

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;药品信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广大…

11-适配器模式(Adapter)

意图 将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能在一起工作的那些类可以一起工作。 适配器模式属于结构模式。 类适配器模式&#xff08;通过继承的方式实现适配器模式&#xff09; Adapter类&#xff0c;通过继承src类&#xff0…