2-qt之信号与槽-简单实例讲解

前言、因实践课程讲解需求,简单介绍下qt的信号与槽。

一、了解信号与槽

怎样使用信号与槽?

概览

还记得 X-Window 上老旧的回调函数系统吗?通常它不是类型安全的并且很复杂。(使用)它(会)有很多的问题。Qt提供了一种新的事件处理系统-信号-槽。想象一下闹钟(工作的样子)。当闹铃响的时候,它正在发出信号(发射)。而你处理这个事件的过程就类似使用一个槽的样子。

  • 每个QObject类(或其派生类)的对象都可以含有你能想象到的一样多的信号和槽
  • 只有定义过这个信号的类或者其派生类能够发射这个信号
  • 可以把一个槽与另一个槽连接起来(做成信号链)
  • 每个信号与槽之间可以有无限制数量的连接
  • 注意: 不能为槽的参数设置缺省值。例如以下代码是错误的:

void mySlot(int i = 0);

信号与槽的连接

可以使用下面的模板(原型)连接信号和槽:

QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method);

必须把上式中的const char * signal和const char * method分别放进SIGNAL() 和SLOT() 这两个宏里面。

可以像下面那样解除信号和槽的连接:

QObject::disconnect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method);

进一步探讨

当事件发生时,某个部件(或对象)就会发射信号。比如,当一个按钮部件被点击时,它就会发出"被点击"这个信号。开发者可以选择创建一个函数(没错,它就是一个"槽"),并使用

connect()

来把这个信号与槽关联起来。Qt的信号与槽机制(被设计成)并不要求这些相关的类互相了解,这就使得开发高度可重用的类变得更容易。由于信号与槽是类型安全的,类型错误会以警告的方式(被编译器)报告出来并且不会引起(程序)崩溃。 举例来说,假如一个Quit按钮的

clicked()

信号与应用程序的

quit()

槽相连接,那么当用户点击该Quit按钮时,就会终止这个程序的运行。用代码实现该连接如下:

connect(button, SIGNAL (clicked()), qApp, SLOT (quit()));

在应用程序运行期间的任何时候,信号与槽的连接都可以被添加或移除。它们可以在信号被立即或者安排到以后去发射时建立起来,而且可以用于不同对象间的多线程应用中。

信号与槽机制是使用标准C+实现的。它使用了C中的预处理器以及Qt中的

moc, 即元对象编译器( Meta-Object Compiler)。代码的生成由Qt的构建系统(Qt's-Build-System)自动完成。开发者几乎不需要浏览或者编辑这些代码。

除了完成信号与槽的处理,元对象编译器还对Qt的多语言机制、属性系统以及扩展的运行时类型识别提供了支持。它还为C+程序的运行时内省在所有支持的平台上的运行提供了一种途径。

二、实例讲解

三、实例代码:

 .pro文件

QT +=widgets

CONFIG += c++11

SOURCES += \

main.cpp

/****************************************

* 项目名:2_14

* 说  明:连接信号与槽

****************************************/

#include<QApplication>

#include<QWidget>

#include<QPushButton>

#include<QLineEdit>

#include<QSignalMapper>

int main(int argc,char* argv[])

{

    QApplication a(argc,argv);

    QWidget w;

    QLineEdit lineEdit(&w);

    QPushButton btn1(&w),btn2(&w),btn3(&w);

    w.resize(200,200);      //设置窗口和各部件的大小、位置,显示的文本等

    lineEdit.move(10,10);

    btn1.move(10,40);

    btn2.move(10,70);

    btn3.move(10,100);

    lineEdit.setText("我是21级电信专业的");

    btn1.setText("清除");

    btn2.setText("设置一段文字");

    btn3.setText("关闭窗口");

    //信号槽连接

    QObject::connect(&btn1,SIGNAL(clicked()),&lineEdit,SLOT(clear()));

    QObject::connect(&btn3,SIGNAL(clicked()),&w,SLOT(close()));

    //通过QSignalMapper把无参clicked信号翻译成带QString参数的信号

    QSignalMapper mapper;

    QObject::connect(&btn2, SIGNAL(clicked()), &mapper, SLOT(map()));

    mapper.setMapping(&btn2, "我是1a班");

    QObject::connect(&mapper, SIGNAL(mapped(const QString&)),&lineEdit, SLOT(setText(const QString&)));

    //使用lamda表达式解决

    //QObject::connect(&btn2,&QPushButton::clicked,&lineEdit,[&]{lineEdit.setText("我是一行文字");});

    w.show();

    return a.exec();

}

运行界面效果:

<<main.cpp>>

<<2_14.pro.user>>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis-分片机制

概述 业务需要&#xff1a;由于单台redis内存容量是有限的&#xff0c;无法实现海量的数据实现缓存存储 概念&#xff1a;由多个redis节点协助工作的机制就是redis的分片机制 作用&#xff1a;为了实现redis扩容 特点&#xff1a;分片机制把该机制中包含的多台redis缓存服务…

RK3568 学习笔记 : u-boot 下通过设置 env ethact 设置当前工作的以太网设备

前言 正点原子 &#xff1a;RK3568 开发板 atompi-ca1 默认有两个网口&#xff0c;通过 u-boot mii 命令&#xff0c;可以查看 网口信息 > mii device MII devices: ethernetfe010000 ethernetfe2a0000 Current device: ethernetfe010000u-boot 下的以太网&#xff0c;不同…

如何为 Nestjs 编写单元测试和 E2E 测试

前言 最近在给一个 nestjs 项目写单元测试&#xff08;Unit Testing&#xff09;和 e2e 测试&#xff08;End-to-End Testing&#xff0c;端到端测试&#xff0c;简称 e2e 测试&#xff09;&#xff0c;这是我第一次给后端项目写测试&#xff0c;发现和之前给前端项目写测试还…

UDP 的报文结构

一.UDP的报文结构 1.UDP的简单介绍 UDP是传输层协议&#xff0c;它是无连接,不可靠传输,面向数据报,全双工 1.无连接&#xff1a;UDP是一种无连接的传输协议&#xff0c;通信双方不需要在发送数据之前建立连接。相比之下&#xff0c;TCP是面向连接的协议&#xff0c;在传输数…

【除了协程还有哪些方式可以实现异步编程】

在Unity中&#xff0c;除了使用协程实现异步编程外&#xff0c;还有以下几种方法&#xff1a; 异步加载资源&#xff1a; 使用UnityWebRequest类进行异步加载资源&#xff0c;这在加载网络资源或动态加载资源时非常有用。 using UnityEngine; using UnityEngine.Networking;…

【Linux】进程控制 之 进程创建 进程终止 进程等待 进程替换

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

每日一博 - 闲聊架构设计中的多级缓存设计

文章目录 方法论概述客户端缓存应用层缓存服务层缓存缓存设计的注意事项总结 思维导图戳这里 方法论概述 从客户端到服务层&#xff0c;缓存的应用广泛而重要。通过合理的缓存设计&#xff0c;能够有效地提高系统的性能并降低延迟。 客户端缓存 在客户端层面&#xff0c;浏览…

LLM2Vec介绍和将Llama 3转换为嵌入模型代码示例

嵌入模型是大型语言模型检索增强生成(RAG)的关键组成部分。它们对知识库和用户编写的查询进行编码。 使用与LLM相同领域的训练或微调的嵌入模型可以显著改进RAG系统。然而&#xff0c;寻找或训练这样的嵌入模型往往是一项困难的任务&#xff0c;因为领域内的数据通常是稀缺的。…

基于AT89C51单片机的温度上下限自动控制检报警设计

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/89247694?spm=1001.2014.3001.5501 C 源码+仿真图+毕业设计+实物制作步骤+06 题 目 基于单片机的温度检测调节系统设计 姓 名 学 号 专业班级 指导教师 年 月 日 任务书 …

Nginx 从入门到实践(2)——Rewrite重写

Nginx Rewrite Rewrite重写 Nginx Rewriteurl组成说明Rewrite基本概述Rewrite使⽤场景rewrite优点 Rewrite配置语法location匹配概述 if指令if 判断指令语法nginx以及if 判断可使用的全局变量 set命令return指令 url组成说明 https://cn.bing.com/search?qNginxRewrite&P…

udp/tcp回显网络编程

udp DatagramSocket 用于接收和发送udp数据报 构造方法&#xff1a; DatagramSocket():创建一个UDP数据报套接字的Socket&#xff0c;绑定到本地上 一个随机可用端口上&#xff0c;一般用于客户端DatagramSocket(int port):创建一个UDP数据报套接字的Socket&#xff0c;绑定到…

Proxmox VE 8 用SDN隔离用户网络

作者&#xff1a;田逸&#xff08;formyz&#xff09; 最新发布的Proxmox VE&#xff08;以下简称PVE&#xff09; 8在Web管理后台集成了易于操作的SDN&#xff08;软件定义网络&#xff09;功能插件&#xff0c;其实质是对不同的PVE用户指定不同的网络&#xff0c;进行逻辑隔离…

将要上市的自动驾驶新书《自动驾驶系统开发》中摘录各章片段 4

第十三章 车联网 数字化设备正变得越来越普遍并且相互联系。这些设备向数字生态系统智能部分的演进创造了迄今为止尚未解决安全问题的新颖应用。一个特定的例子是车辆&#xff0c;随着车辆从简单的交通方式发展到具有新的感知和通讯功能的智能实体&#xff0c;就成为智能城市的…

屏蔽罩材质和厚度对屏蔽效能的影响

​ 一&#xff0e;屏蔽效能的影响因素 屏蔽效能的影响因素主要有两个方面&#xff1a;屏蔽材料的特性和厚度&#xff1b;如下图所示&#xff0c;电磁波经过不同媒介时&#xff0c;会在分界面形成反射&#xff0c;穿过界面的电磁波一部分被反射回去&#xff0c;这部分能量损失…

偶然发现了Python的一个BUG。。。

一般情况下&#xff0c;dict(id1, **{id: 1})这句代码应该报TypeError。但如果在捕获了其他异常的情况下&#xff0c;再来执行这句代码&#xff0c;却是会报KeyError&#xff0c;如下图&#xff1a; Python3.10和Python3.9也能复现该情况&#xff0c;正当我摩拳踩掌&#xff0c…

百度下拉框负面信息如何删除?

百度头条360等搜索引擎&#xff0c;作为人们获取信息的主要途径之一。然而&#xff0c;一些知名的企业或个人可能会面临在搜索的下拉框中出现负面信息的问题&#xff0c;这可能对其声誉和形象造成不良影响。小马识途营销顾问根据自身从业经验&#xff0c;针对这类情况提出以下建…

【精品毕设推荐】基于JSP物流信息网的设计与实现

点击免费下载原文及代码、PPT 摘要 本文讲述了基于JSP物流信息网的设计与实现。该系统使用java语言开发&#xff0c;使系统具有更好的平台性和可扩展性。 该系统实现了用户登录、注册、查询快递信息、快递公司注册成为合作伙伴以及系统管理员对信息进行管理等功能。系统的主…

LeetCode 234.回文链表

题目描述 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为 回文链表 。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff…

解决windows中的WSL Ubuntu子系统忘记root密码和用户密码问题

1、以管理员身份运行PowerShell 2、在powershell中执行wsl.exe --user root wsl.exe --user root如果出现了上面的报错&#xff0c;则需要运行步骤3、4&#xff0c;然后在执行步骤5改密码&#xff0c;如果没有出错&#xff0c;请直接跳到第5步改密码操作&#xff01;&#xff…

一分钱不花从HTTP升级到HTTPS

HTTP升级到HTTPS是一个涉及安全性和技术实施的过程&#xff0c;主要目的是为了提升网站数据传输的安全性&#xff0c;防止数据被窃取或篡改。以下是一些关于从HTTP升级到HTTPS的技术性要点和步骤概述&#xff0c;结合上述信息资源&#xff1a; 一、理解HTTPS的重要性 HTTPS (…