Qt信号和槽 定时器
文章目录
- 1 信号和槽
- 1.1 信号和槽的概念
- 1.2 信号和槽的应用
- 1.3 信号和槽的连接
- 1.4 信号和槽的特性
- 1.5 生活中的类似例子
- 1.6 信号和槽的优势
- 2 信号和槽的使用
- 2.1 控件的信号和槽
- 2.2 自定义信号和槽
- 2.3 信号和槽的参数传递
- 3 定时器
- 3.1 QTimer类的基本使用
- 3.2 QTimer类的成员函数
- 4 事件和事件过滤器
- 4.1 概念
- 4.2 事件过滤器的使用
- 5 事件循环
- 6 子窗口的使用和窗口间的数据传递
- 6.1 子窗口的使用
- 6.2 窗口间的数据传递
- 7 INI配置文件
- 7.1 介绍
- 7.2 使用Qt读写INI文件
1 信号和槽
1.1 信号和槽的概念
在程序中,当某个事件(如按钮被单击)发生时,会在程序内部广播一段特定的消息,这个消息就是信号。槽(Slot)是响应信号的函数,也称为“槽函数”。槽函数是一个C++函数,可以定义在类的任何部分,可以有参数,可以被调用。
当有信号发射时,与之相连接的槽函数会自动执行。信号和槽可以根据需要随时连接和断开。
1.2 信号和槽的应用
在Qt编程中,信号和槽的应用非常广泛,可以用于各种场合,例如:
- 处理用户输入事件,如按钮单击事件、鼠标移动事件等;
- 处理系统事件,如窗口关闭事件、定时器事件等;
- 在多线程编程中,用于线程之间的通信;
- 在自定义控件中,用于实现控件之间的交互等。
1.3 信号和槽的连接
在Qt中,信号和槽的连接非常简单,可以使用connect()函数进行连接。connect()函数的第一个参数是发射信号的对象指针,第二个参数是信号的名称,第三个参数是接收信号的对象指针,第四个参数是槽函数的名称。例如(Qt4写法):
connect(button, SIGNAL(clicked()), this, SLOT(onButtonClicked()));
1.4 信号和槽的特性
信号和槽具有以下特性:
- 信号可以连接到多个槽函数,一个槽函数也可以连接到多个信号;
- 信号和槽可以是跨线程的,可以在不同线程中进行连接和断开;
- 信号和槽可以带参数,参数的类型可以是任意Qt支持的类型,包括自定义类型;
- 信号和槽的连接可以在运行时动态创建和断开。
1.5 生活中的类似例子
信号和槽机制在生活中也有很多类似的例子,例如:
- 电视遥控器和电视之间的信号和槽,遥控器上的按钮相当于信号,电视上的操作相当于槽;
- 汽车上的各种控制按钮和汽车控制系统之间的
- 手机上的触摸屏和手机应用程序之间的信号和槽,触摸屏上的操作相当于信号,应用程序中的响应函数相当于槽。
这些例子中,信号和槽的作用是相似的,都是用来实现不同组件之间的交互和通信。
1.6 信号和槽的优势
使用信号和槽机制有以下优势:
- 降低组件之间的耦合度:组件之间通过信号和槽进行通信,不需要了解对方的实现细节,从而降低了组件之间的耦合度。
- 代码可读性好:使用信号和槽机制可以使代码结构清晰,易于阅读和维护。
- 代码重用性高:一个信号可以连接多个槽函数,从而提高了代码的重用性。
- 程序执行效率高:由于信号和槽是动态连接的,只有在需要时才会执行,因此程序执行效率相对较高。
2 信号和槽的使用
2.1 控件的信号和槽
在Qt中,控件的信号和槽是应用最为广泛的一种信号和槽。
- 信号由信号名和一对括号构成,如clicked(),类似于函数名。
- 信号可以带有参数,如clicked(bool)。
- 槽函数是响应信号的函数,可以定义在类的任何部分,可以有参数,可以被调用。
- 槽函数在响应信号的时候,可以接收信号的参数并进行处理。
- Qt会自动为clicked()信号生成对应的槽函数,命名规则为:on_控件名_信号名(参数列表,可为空)。
- 开发者在手工编写函数时也可以按照以上命名规则命名,系统会将手工编写的函数认作控件的槽函数。
2.2 自定义信号和槽
除了控件信号和槽外,我们还可以自定义信号和槽。
- 自定义信号和槽的声明方式与普通成员函数相同。
- 信号必须在signals关键字下声明,槽必须在slots关键字下声明。
- 信号可以有参数,也可以没有参数,但是不能有函数体,因为信号只是一个声明,没有具体的实现。
- 槽函数的声明与普通成员函数相同,可以有参数,有函数体,但需要在函数体前添加slots关键字。
2.3 信号和槽的参数传递
信号和槽之间可以进行参数传递,可以将信号参数传递给槽函数,也可以将槽函数的返回值作为信号的参数传递出去。参数传递的方式有以下两种:
- 直接传递参数
- 通过信号与槽函数的参数列表进行绑定,将信号参数传递给槽函数。
3 定时器
定时器是一种在编程中非常常见的工具,可以用于定时执行某些操作。在Qt中,使用QTimer类来实现定时器功能。
3.1 QTimer类的基本使用
与日常生活中使用的闹钟类似,定时器也需要先设置时间,然后启动定时器,在定时时间到达时发出信号,执行槽函数。QTimer类的使用主要包括两个步骤:定时和启动。在使用QTimer类之前,需要引用头文件:
#include <QTimer>
3.2 QTimer类的成员函数
QTimer类的常用成员函数包括:
- start(std::chrono::milliseconds msec):启动定时器,参数为定时时间(单位为毫秒)。
- stop():停止定时器。
- setTimerType(Qt::TimerType type):设置定时器精度。
Qt提供了三种定时策略,分别为:
精确的定时(Qt::PreciseTimer,毫秒级精度)
粗略的定时(Qt::CoarseTimer,5%左右的定时误差)——默认
非常粗略的定时(Qt::VeryCoarseTimer,精度在1s左右) - singleShot(int msec, const QObject *receiver, const char *member):单次定时。
定时时间由参数msec指定,单位为毫秒。定时结束后会自动调用receiver的槽函数member。
QTimer类只有一个信号timeout(),当定时结束后,会自动发射该信号。可以将timeout()信号与槽函数连接,以实现在定时器结束后执行特定的操作。
4 事件和事件过滤器
4.1 概念
事件是程序内部或外部产生的事情或某种动作的通称。Qt中常见事件包括鼠标事件、键盘事件、定时事件、上下文菜单事件、关闭事件、拖放事件、绘制事件等。在Qt中,事件的类型在QEvent::Type中有着详细的定义。
系统可以捕获事件,然后根据事件的类型和来源进行处理。有时开发者会希望拦截某个事件并进行处理,从而实现自定义的功能。
4.2 事件过滤器的使用
事件过滤器可以对控件的事件进行过滤和拦截,从而改变处理事件的方式。为了使用事件过滤器,需要进行以下步骤:
(1)在目标对象上调用installEventFilter()函数注册事件过滤器。也可以使用removeEventFilter()函数删除已有的事件过滤器。
(2)向类中添加eventFilter()函数,并完成事件处理代码。
(3)确定事件的后续去向,即是否需要将事件传递给系统处理。如果在eventFilter()函数中返回false,那么事件将发送给系统。如果返回了true,那么该事件会被丢弃,后续的事件过滤器和系统都不能检测到这一事件。
5 事件循环
事件循环是一种常见的等待机制,是一个无限循环,在运行事件循环后,程序会进入阻塞状态,直到收到退出信号后才能退出循环并执行后续的代码。Qt提供了QEventLoop
类来进入和退出事件循环。
在使用事件循环时,需要创建QEventLoop实例,并连接事件循环的quit()函数和退出信号,然后调用exec()启动循环。事件循环的退出可以通过收到退出信号或者主动调用exit()函数来实现。
当需要在一定时间后强制退出事件循环时,可以使用QTimer::singleShot()函数来触发退出事件循环。这样在一定时间后就会自动退出事件循环,从而继续执行后续代码。
6 子窗口的使用和窗口间的数据传递
6.1 子窗口的使用
在Qt中,主窗口和子窗口都是以类的形式存在的。添加子窗口和添加类十分类似。在主窗口中引用子窗口类的头文件,并在主窗口类中增加一个子窗口类的成员变量。调用子窗口的show()函数即可显示子窗口。
6.2 窗口间的数据传递
Qt提供了多种方法实现窗口间的数据传递,包括使用全局变量、公有成员函数和信号槽机制。
(1)使用全局变量。在主窗口中添加用于保存数据的全局变量,然后在子窗口中访问全局变量,从而实现数据的传递。
(2)使用公有成员函数。在子窗口类中增加公有成员函数用于接收数据。在主窗口中调用子窗口的公有成员函数,从而实现数据的传递。
(3)使用信号和槽。在子窗口中定义信号,信号的参数是需要传递的数据。在主窗口中定义槽函数,用于接收信号发来的数据。通过将子窗口的信号连接到主窗口的槽函数,实现数据的传递。
7 INI配置文件
7.1 介绍
INI文件是一种常用于Windows操作系统中的非正式标准,用于保存软件的配置信息。INI文件由多个节和每个节下的键组成,每个键包含键名和键值两部分,键名和键值之间通过英文的等号连接。
7.2 使用Qt读写INI文件
Qt提供了QSettings类,可以方便地实现INI文件的读写。QSettings类中关于INI文件读写的成员函数包括:beginGroup()用于进入节,endGroup()用于退出节,setValue()用于写入键值,value()用于读取键值,contains()用于判断某个键值是否存在。
相关文章:
Qt信号和槽 定时器
文章目录 1 信号和槽1.1 信号和槽的概念1.2 信号和槽的应用1.3 信号和槽的连接1.4 信号和槽的特性1.5 生活中的类似例子1.6 信号和槽的优势 2 信号和槽的使用2.1 控件的信号和槽2.2 自定义信号和槽2.3 信号和槽的参数传递 3 定时器3.1 QTimer类的基本使用3.2 QTimer类的成员函数…...
zemax对称式目镜
两个几乎对称的双胶合透镜相对放置,可以达到25度的半视场 为了加工方便,这两个透镜组采用相同的结构 对称式目镜要求各组透镜自行校正色差,这样倍率色差也随之而校正。 它还能校正两种像差,慧差和象散。 对称目镜的结构更紧&…...
层次架构、面向服务架构(四十四)
层次架构设计 表现层、中间层、数据访问层、数据架构规划、物联网层次架构、层次式架构案例分析。 层次结构缺点就是效率问题,上一层调用下一层。 1、着重写中间层 组件设计:面向接口编程,分为接口和实现类。 实体设计:实体表…...
Ubuntu22无法自动进入lightdm图像界面
问题:Ubuntu22无法自动进入lightdm图像界面,必须手动运行 lightdm start解决方案: 方案一: 运行一个终端输入 cat /etc/X11/default-display-manager /etc/init/lightdm.conf不接受lightdm作为设置,但是,/…...
01BFS最短距离的原理和C++实现
时间复杂度 O(n),n是边数。 使用前提 边的权只有两种:0,1。 典型场景 n个端点的无向图,编号范围[0,n)。Edges0表示{{n1,n2},...{n3,n4}}表示n1和n2,n3和n4之间有路联接。Edges1表示{{n1,n2},...{n3,n4}}表示n1和n2,n3和n4之间…...
【洛谷 P5266】【深基17.例6】学籍管理 题解(映射+分支)
【深基17.例6】学籍管理 题目描述 您要设计一个学籍管理系统,最开始学籍数据是空的,然后该系统能够支持下面的操作(不超过 1 0 5 10^5 105 条): 插入与修改,格式1 NAME SCORE:在系统中插入姓…...
10.03
代码 #include <iostream>using namespace std; class cz { private:int num1; //实部int num2; //虚部 public:cz(){}cz(int a,int b):num1(a),num2(b){}cz(const cz &other):num1(other.num1),num2(other.num2){}~cz(){}const cz operator(const cz &othe…...
链表单向链表跳跃链表
单向链表 link list t数组的局限:编译期就需要知道大小; 内存连续,插入困难 // 链表节点类 包含一个信息 和指向下一个 节点的指针clas IntLLNode{public:IntLLNode(){// 默认构造函数 没有info信息nextPtr_ 0;// 空指针}IntLLNode(int …...
博客无限滚动加载(html、css、js)实现
介绍 这是一个简单实现了类似博客瀑布流加载功能的页面,使用html、css、js实现。简单易懂,值得学习借鉴。👍 演示地址:https://i_dog.gitee.io/easy-web-projects/infinite_scroll_blog/index.html 代码 index.html <!DOCT…...
腾讯云南京服务器性能如何?南京服务器测速IP地址
腾讯云服务器南京地域怎么样?南京地域很不错,正好处于中间的位置,南方北方用户均可以选择,网络延迟更低速度更快,并且目前南京地域有活动,南京地域可用区可选南京一区、南京二区和南京三区,腾讯…...
MySQL和Oracle中,语法的不同点以及如何在xml中书写日期比较大小
众所周知mysql和oracle的语法有点相识,又有点不同。 在MySQL和Oracle中,语法的不同点有以下几个方面: 数据类型:MySQL和Oracle支持的数据类型有所不同,比如MySQL支持的数据类型包括:整型、浮点型、字符型、…...
谈谈Redis分布式锁
目录 一、回顾分布式锁 (一)理解分布式锁的定义 (二)分布式锁的约束条件 (三)分布式锁常见实现方式 基于数据库的分布式锁 基于缓存的分布式锁 基于分布式一致性算法的分布式锁 基于文件系统的分布…...
Redis的java客户端-RedisTemplate光速入门
一.创建springboot项目 二.引入2个依赖 <!-- redis依赖-->这个已经引入了,因为创建的时候勾选了<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><…...
格点数据可视化(美国站点的日降雨数据)
获取美国站点的日降雨量的格点数据,并且可视化 导入模块 from datetime import datetime, timedelta from urllib.request import urlopenimport cartopy.crs as ccrs import cartopy.feature as cfeature import matplotlib.colors as mcolors import matplotli…...
YoloV8改进策略:LSKNet加入到YoloV8中,打造更适合小目标的YoloV8
文章目录 摘要论文:LSKNet:大选择核网络在遥感目标检测中的应用1、简介2、相关工作2.1、遥感目标检测框架2.2、大核网络2.3、注意力/选择机制3、方法3.1、LSKNet架构3.2、大核卷积3.3、空间核选择4、实验4.1、数据集4.2、实现细节4.3、消融实验4.4、主要结果4.5、分析5、结论…...
力扣-303.区域和检索-数组不可变
Idea 需计算数组nums在下标right 和 left-1 的前缀和,然后计算两个前缀和的差即可。 需要注意的是,当left为0的时候,如果还是left-1则会发生数组访问越界错误。 AC Code class NumArray { public:vector<int> sum;NumArray(vector<…...
web:[极客大挑战 2019]LoveSQL
题目 打开页面显示如下 查看源代码,查到一个check.php,还是get传参 尝试账号密码输入 题目名为sql,用万能密码 1or 11# 或 admin or 11 给了一段乱码,也不是flag 查看字段数 /check.php?usernameadmin order by 3%23&pass…...
数据结构—快速排序(续)
引言:在上一篇中我们详细介绍了快速排序和改进,并给出了其中的一种实现方式-挖坑法 但其实快速排序有多种实现方式,这篇文章再来介绍其中的另外两种-左右指针法和前后指针法。有了上一篇挖坑法的启示,下面的两种实现会容易许多。 …...
Snapdragon Profiler分析Android GPU
Snapdragon Profiler(骁龙分析器)是一款性能分析软件,在Windows、 Mac、和 Linux平台上都可以运行,主要是用来分析使用了高通骁龙处理器的Android设备。 Snapdragon Profiler通过USB连接这些Android设备,开发者可以用…...
Cannot download sources:IDEA源码无法下载
问题 Swagger的相关包,无法看到注释; 在class文件的页面,点击下载源码,源码下载不了,IDEA报下面的错误。 报错 Cannot download sources Sources not found for: io.swagger.core.v3:swagger-annotations:2.2.9 解决…...
从零开始学习 Java:简单易懂的入门指南之IO字符流(三十一)
IO流之字符流 1. 字符流1.1 字符输入流【Reader】1.2 FileReader类构造方法读取字符数据 1.3 字符输出流【Writer】1.4 FileWriter类构造方法基本写出数据关闭和刷新写出其他数据 2. IO异常的处理JDK7前处理JDK7的处理JDK9的改进 3. 综合练习练习1:拷贝文件夹练习2&…...
监狱工具管理系统-监狱劳动工具管理系统
监狱劳动工具管理系统(智工具DW-S308)是依托互3D技术、云计算、大数据、RFID技术、数据库技术、AI、视频分析技术对工具进行统一管理、分析的信息化、智能化、规范化的系统。 当前各级监狱工器具管理更多的是借助于传统的人工管理方法和手段,数据的采集和录入一直以…...
蓄水池算法
题目: 假设有一组数据流元素有 N 个(事先不知道 N 具体值),我们希望选择 n 个样本(N > n),使用怎样的策略进行抽样可以使得数据流中每个元素被选择的概率恰为 n / N 结论: 创建大…...
作业 day4
完成父子进程通信...
erlang练习题(四)
题目一 传入列表 L1[K|]、L2[V|]、L3[{K,V}|_],L1和L2一一对应,L1为键列表,L2为值列表,L3为随机kv列表, 将L1和L2对应位合并成KV列表L4,再将L3和L4相加,相同key的value相加 如:L…...
YoloV5实时推理最短的代码
YoloV5实时推理最简单代码 import cv2 import torch# 加载YOLOv5模型 model torch.hub.load(ultralytics/yolov5, yolov5s)# 使用CPU或GPU进行推理 device cuda if torch.cuda.is_available() else cpu model.to(device)# 打开摄像头(默认摄像头) cap…...
Tensorflow、Pytorch和Ray(张量,计算图)
1.深度学习框架(Tensorflow、Pytorch) 1.1由来 可以追溯到2016年,当年最著名的事件是alphago战胜人类围棋巅峰柯洁,在那之后,学界普遍认为人工智能已经可以在一些领域超过人类,未来也必将可以在更多领域超过…...
TinyWebServer学习笔记-让程序跑起来
目标:通过这个HTTP项目熟悉网络编程 系统:Ubuntu20.04 首先,学习的第一步就是先让程序跑起来,使用git将项目下载到虚拟机内: git clone https://github.com/qinguoyi/TinyWebServer.git 提前把MySQL数据库安装好&am…...
_tkinter.TclError: no display name and no $DISPLAY environment variable 解决
启动kohya_ss时可能会发生错误: _tkinter.TclError: no display name and no $DISPLAY environment variable 解决办法: 1、apt-get install xvfb //安装xvfb // 启动虚拟显示器 2、Xvfb :99 -screen 0 1024x768x16 & export DISPLAY:99 ps aux…...
我出手了!
时光飞逝,程序员小灰这个微信公众号,已经运营整整7年时间了。 在这7年里,小灰输出过各种各样的文章和视频,有讲编程技术的,有讲职业规划的,有讲互联网行业新闻的,也有讲自己个人生活的。 不过&a…...
东莞网络建站公司/深圳高端seo公司助力企业
一、什么是缓存雪崩 当缓存服务器宕机或者在某一个时间段大量缓存集中失效,这时所有的请求都直接查询后端数据库,给数据库造成极大的压力甚至是宕机,从而引起应用服务器雪崩。 二、缓存雪崩的解决方案 对于缓存服务宕机造成的缓存雪崩&…...
有哪些网站可以学做糕点的/重庆关键词搜索排名
react-native-app-introreact-native-app-intro是一个react native组件,实现了一个视觉差效果欢迎页,基于react-native-swiper,类似与谷歌应用程序比如Sheet,Drive,Docs等。支持iOS、Android安装基础使用你可以使用pag…...
学做川菜网站/一元友情链接平台
面向对象使用class 关键字声明类class class_name:构造函数__init__(self):所有的方法必须加上self参数,self代表类的实例,在定义时必须有。通过.访问属性或方法,实例.方法(),类名.属性(相当于静…...
做网站什么主题比较好/北京seo培训机构
浅谈 Linux 内核无线子系统 本文目录 1. 全局概览2. 模块间接口3. 数据路径与管理路径4. 数据包是如何被发送?5. 谈谈管理路径6. 数据包又是如何被接收?7. 总结一下Linux 内核是如何实现无线网络接口呢?数据包是通过怎样的方式被发送和接收呢…...
北京网站设计优刻/东莞网络排名优化
操作系统(Operating System, OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配,以提供给用户和其他软件方便的接口和环境的程序集合。计算机操作系统是随着计算机研究和应用的发展逐步形成并发展起来的&#…...
定制网站开发报价/app推广赚钱平台
Java Q&A: 使用Factory Method模式 (转)[more]Java Q&A: 使用Factory Method模式Q: 阅读 "Polymorphism in its purest form" 一文时,我看到了一个不熟悉的术语 "Factory method"。你能解释一下什么是Factory method并说明如何使用它吗…...