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

ops/2024/10/18 18:28:35/

前言、因实践课程讲解需求,简单介绍下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>>


http://www.ppmy.cn/ops/34101.html

相关文章

自动驾驶融合定位系列教程五:惯性导航误差分析

自动驾驶融合定位系列教程五&#xff1a;惯性导航误差分析 一、概述 在定位领域的几乎所有多传感器融合系统中&#xff0c;都有IMU存在&#xff0c;而且&#xff0c;IMU是定位系统的主线与核心&#xff08;对此可能很多人并不同意&#xff0c;但是我仍然坚定地坚持这一观点&a…

uniap之微信公众号支付

近来用uniapp开发H5的时候&#xff0c;需要接入支付&#xff0c;原来都是基于后端框架来做的&#xff0c;所以可谓是一路坑中过&#xff0c;今天整理下大致流程分享给大家。 先封装util.js&#xff0c;便于后面调用 const isWechat function(){return String(navigator.userA…

Apache ShardingSphere知识点表格总结及配置示例

ShardingSphere&#xff08;之前称为Sharding-JDBC&#xff09;是一个分布式数据库解决方案&#xff0c;它提供SQL路由、分片、读写分离、弹性伸缩等功能。ShardingSphere官网的文档和示例也非常详细&#xff0c;所以入门以及在项目中实践其实是很简单的。但是很多培训的课程故…

产品人生(5):从“敏捷开发”到“四化时间管理法”

人生如产品&#xff0c;产品映人生&#xff0c;借鉴产品思维&#xff0c;快速提升软技能&#xff01; 在互联网的敏捷开发实践中&#xff0c;经常会用到“流程化、模板化、清单化、不断优化”的思想来提升开发的效率和产品质量&#xff0c;并确保团队能够快速响应市场变化。大…

Angular基础-搭建Angular运行环境

这篇文章介绍了在Angular项目中进行开发环境搭建的关键步骤。包括node.js安装和配置、安装Angular CLI工具、安装angular-router、创建Angular项目等步骤。这篇文章为读者提供了清晰的指南&#xff0c;帮助他们快速搭建Angular开发环境&#xff0c;为后续的项目开发奠定基础。 …

Markdown语法-Mermaid和Flowchart流程图

流程图 一、Mermaid流程图二、Flowchart流程图 一、Mermaid流程图 mermaid flowchat st>start: 开始 e>end: 结束 op>operation: 我的操作 cond>condition: 确认&#xff1f; st->op->cond cond(yes)->e cond(no)->opCreated with Raphal 2.3.0 开始 …

物联网小demo

机智云生成代码 具体参考之前的文章 初始化 ADC用来使用光敏电阻 连续采样开启 采样的周期调高 定时器 定时器1用来实现延时 为了只用温湿度模块DHT11 定时器4用来和51进行交互 实现定时的发送和检测心跳信号 IIC 用来使用oled屏幕 USART 串口1和串口2是机智云自己…

flink sql 优化

文章目录 一、参数方面二、资源方面三、总结 提示&#xff1a;实时flink sql 参考很多网上方法与自己实践方法汇总(版本:flink1.15) 一、参数方面 flink sql参数配置 //关闭详细算子链(默认为true),true后job性能会略微有提升。false则可以展示更详细的DAG图方便地位性能结点…