Qt --- 常用控件的介绍 --- 其他控件

一、QPushButton

QWidget中设计到的各种属性/函数/使用方法,针对接下来要介绍的Qt的各种控件都是有效的。

使用QPushButton表示一个按钮,这也是当前我们最熟悉的一个控件了。这个类继承了QAbstractButton,这个类是一个抽象类,是其他按钮的父类。

抽象类,这个类包含了纯虚函数,无法创建出实例,想要使用这个类,就得创建子类,重写上述的纯虚函数,才能够创建出子类的实例。

按钮的属性

QPushButton相关代码

1)给按钮加图标(图片)

后续编写代码,如果用到一些图片等外部资源,都会优先使用qrc,除非遇到特别大的资源。

虽然图标有了但是我们就喜欢大的。

2)添加快捷键

前面写过一个例子通过四个按钮,控制target按钮的移动,之前这个移动式通过鼠标点击按钮实现的。此处我们就可以引入快捷键,通过快捷键来操作。此处按钮直接通过图片来表示。

设置槽函数。

设置快捷键

参数是一个QKeySequence对象,key按键,sequence顺序表,按下得快捷键,不一定是一个按键,也可能是组合键。

键盘快捷键默认就是能连发的,但是鼠标点击按钮则不行,设置autoRepeat属性。

二、QRadioButton

QRadioButton是单选按钮,可以让我们在多个选项中选择一个

属性

 check选中,checkable是否可以被选中,checked选完了。排他性:选项只能选中一个还是选中多个。checkable只是能够让按钮不选中,仍然可以响应点击事件。使用enable属性来设置不被响应。

代码:

问题:

clicked(bool) 从此处checked就表示了当前radioButton的选中状态。

toggled(bool) 切换的时候会被触发,checked状态发生改变,就会触发这个信号

代码:

代码:基于QRadioButton写一个模拟点餐的小程序,RadioButton默认是排他的,一旦界面上存在多组单选按钮的时候,希望组和组之间不要有影响。Qt中提供了QButtonGroup类,可以针对单选按钮进行分组。

三、CheckBox的使用

QCheckBox表示复选按钮,可以允许选中多个和QCheckBox最相关的属性也是checkable和checked,都是继承自QAbstractButton。

代码:写一个今日任务的复选框代码

四、QLabel的属性

右对齐,左对齐,居中对齐等等。

 QLable的文本格式

代码:

设置图片,显示图片

事件:用户的操作,会对应一些信号,Qt中表示用户的操作有两类概念,一个是信号,另一个是事件。当用户拖拽修改窗口大小的时候,就会触发resize事件(resizeEvent),像resize这样的事件,是连续变化的,把窗口尺寸从A拖到B这个过程中,会触发一系列的resizeEvent此时我们就可以借助resizeEvent来完成上述的功能。可以让Widget窗口类,重写父类QWidget的resizeEvent虚函数。在鼠标拖动窗口尺寸的过程中,这个函数就会被反复调用执行,每次触发一个resizeEvent事件都会调用一次对应的虚函数。由于此处进行了函数重写,调用父类的虚函数就会实际调用到子类的对应的函数(多态)。在实际编程中,指定回调函数其实有很多种写法

1)设置函数指针

2)设置仿函数

3)设置lambda

4)通过重写父类虚函数(框架中拿着父类的指针调用这个函数,如果你创建了子类重写了这个函数,此时在多态机制下,实际执行的就是子类的函数了)。

5)Qt中的信号槽

代码:此处形参event是非常有用的,这里就包含了触发resize事件这一时刻,窗口的尺寸的数值。

QLable的对齐方式

在Qt Creator右侧属性编辑区,能够看到类之间的继承关系,QLabel继承自QFrame,QFrame继承自QWidget。设置带有边框的Label,

QLabel设置自动换行,边距,缩进

此处设置的缩进即使文本换行了,后续的行也会产生缩进不仅仅是首行缩进。前端中,CSS也能设置缩进,text-indent属性,首行缩进。

代码:

QLabel设置伙伴

代码:Qt中,QLabel中写的文本,是可以指定快捷键的,此处快捷键的规则功能要比QPushButton弱很多。是在文本中使用 & 跟上一个字符来表示快捷键。比如&A =》通过键盘上的alt+a来触发这个快捷键。&B=》通过键盘上的alt+b来触发。绑定了伙伴关系之后,通过快捷键就可以选中对应的单选按钮/复选按钮。

QLabel功能比较丰富的控件。

五、QLCDNumber的属性

是一个专门用来显示数字的控件,类似于老式计算器的效果。

核心属性

 代码:写一个倒计时程序。

使用QLCDNumber显示一个初始的数值,比如10。每隔一秒钟,数字就减1,一直到0,就停止了。

此处关键要点是要实现每秒钟-1这个效果。周期性的执行某个逻辑。C++标准库中,没有提供定时器的实现,Boost里面提供了对应的功能。Qt中也封装了对应的定时器。

结合connect函数,把这个timeout信号绑定到需要的槽函数中,就可以执行逻辑,修改LCDNumber中的数字了。

通过for循环实现上面的逻辑。

C++ 11 标准库中引入了sleep的操作。叫做sleep_for

这个代码是在Widget的构造函数里写的,需要把Widget构造完毕,然后才能执行后续的显示操作。

在构造函数中,另外创建一个线程,在新的线程中,执行上述循环+更新操作。线程操作本身操作系统提供的api,pthread_create windows api可以参阅MSDN windows的文档。

Qt里,里面有一个专门的线程去负责维护更新的(主线程)(main函数所在的线程)对于GUI来说,内部包含了很多的隐藏状态,Qt为了保证修改界面的过程中,线程安全是不会受到影响的,Qt禁止了其他线程直接修改界面。形如这种操作,就是在修改界面。因此Qt为了确保线程安全,直接要求所有的对界面的修改操作,必须在主线程中完成!对于Qt的槽函数来说,默认情况下,槽函数都是由主线程调用的。在槽函数中修改界面是没有任何问题的!a.exec就会使主线程进入”事件循环“exec就会一直循环下去,每执行一次循环就会有一些固定的事情要操作。

六、ProgressBar控件

使用ProgressBar表示一个进度条

代码:创建一个进度条,让这个进度条的进度跟随时间增长,(可以假设,每隔100ms,然进度条+1)。

这个头文件的包含,释放到了widget.h中。上个QLCDNumber的列子中,头文件包含到了.cpp中的。虽然在widget.h中用到了QTimer,但是却没在.h文件中包含QTimer头文件,为啥这个代码编译不会出错?为啥此处的QTimer就不会提示找不到定义之类的。

上述问题其实是通过Qt内部提供的一个特殊技巧来实现的。在Qt中,有一个专门的头文件,这个头文件中包含了Qt中所有类的前置声明。这个头文件一般我们不会直接接触到,但是包含其他的Qt的头文件,都会间接包含到这个头文件。

这个是C++中的特殊技巧,在Qt中被使用到了。

Qt为啥要使用上述的技巧,上述技巧能解决什么问题,有啥提升呢?

主要解决的是编译速度的问题,C/C++的代码,编译速度在其他语言横向对比中,是非常慢的,对于一个大规模的项目,编译速度可能非常满。C++编译速度慢和#include头文件有直接关系的。由于include关系错综复杂,因此尽可能减少include头文件的个数,就可以有效的减少编译事件,Qt中就使用class前置声明的方式,来尽量减少头文件的包含。通过前置声明的方式,Qt中的头文件,每个头文件包含其他头文件数量都能得到一定的降低。但是实际开发中,还是要该包含就包含。与其通过特殊技巧来缩短编译时间,不如说引入更好的硬件资源,来更高效的编译。一些互联网大厂,都有专门的编译集群(分布式编译)。所以在C++ 20标准开始,就引入了模块module来替代#include

把我们的进度条改成红色

选择器,咱们设置的样式到底针对哪个控件生效。

这里发现24%数字跑到了左上角了。这可能是Qt的bug

进度条具体的进度如何设置,一般都是根据实际的任务类型来灵活设置的

例如:要读取一个很大的文件,就可以先获取到文件的总大小,每读取一部分数据(可以计算出读了多少数据),更新一下进度条的数值。设置进度条的过程中,往往确定要搭配定时器的。

七、QCalendarWidget的使用

核心属性

重要的信号

代码:

八、常用控件QLineEdit的属性

QLineEdit用来表示单行输入框,可以输入一段文本,但是不能换行

核心属性

这个text属性不仅仅可以通过代码来设置,用户在输入框中编辑,也会影响到text值的变化。

1)通过代码中设置text,界面上的文本会发生改变。

2)直接操作修改界面上的文本(输入框,可以编辑的),text属性的值也会发生改变。

双向都会发生改变。

常用的信号

代码:让用户输入个人信息。姓名,密码,性别,电话,通过提交按钮,把这些内容全都获取到

inputMask功能比较有限,只能进行简单的验证。就需要使用正则表达式,这是计算机中的通用概念,和具体的编程语言无关。正则表达式,本质上就是带有特殊字符的字符串,特殊字符串用来表示另一个字符串的特征。此时就可以借助正则表达式来描述一些具有一定特点的字符串,基于这些特点,就可以完成字符串的匹配。正则表达式涉及到的这些符号都比较抽象,挺难记忆的,一般情况下我们在开发中都是边写代码边查阅资料来使用的。

代码:

此处的规则是,输入框要检查输入的内容是否是合法的手机号码,如果是,则按钮设为可用状态,如果不是设为不可用状态。

 验证两次输入的密码是否一致,使用textEdited信号,来触发对于两个输入框内容的判定。

形参没有用到会有警告,警告不处理也是完全可以的,以后在公司中,有的团队可能要求,把警告当成错误一样处理比如这样写,这个写法就是类型转换,这个写法对于代码的实际逻辑是没有任何影响的。同时可以骗过编译器,警告就没有了。

代码:针对密码,可以切换显示密码状态。

当前讲的很多的代码例子,都比较简单,但是我们需要认真敲代码。最好做出一些修改尝试。

九、QTextEdit的使用

QPlainTextEdit只能表示纯文本(Plain Text)

而我们要介绍的这个控件支持html和markdown格式的文本。

核心属性

核心信号

代码:获取多行输入框的内容

演示QTextEdit的这几个信号

十、QComboBox的属性

它表示一个下拉框。

核心属性

核心方法

核心信号

弹出下拉框之后,鼠标滑过某个选项,选项会带有高亮效果此时就表示激活。

代码:模拟麦当劳点餐

下拉框里的内容,很多时候不是代码中写死的,而是通过文件/网络加载数据得到的。比如选课操作。

通过文件进行加载

十一、Spin Box控件

它是一个微调框,点击按钮会发生微调

关键属性

核心信号

代码:通过下拉框来选择每个食物的种类,然后再通过微调框选择数量。

十二、QDateTimeEdit的属性

核心属性

通过一些特殊字符来描述时间日期的格式。日常使用的时间日期的格式,没有一个统一的标准。

 UTC是标准时间,科学家通过原子钟,实际生活中,存在一个时差的问题,引入时差,时差就是在标准时间基础上计算一个时间的差值。

核心信号

代码:时间计算器,计算两个时间中间的间隔是多少天/多少小时

上面的程序有bug。daysto函数。使用某个函数的时候,要翻一下文档,看看是否有一些注意的事项。

十三、QDial的使用

它表示一个旋钮

代码:通过旋钮控制窗口的不透明度。

十四、QSlider的使用

它是一个滑动条

核心属性

 

 

代码:在窗口上放两个滑动条,一个是水平,垂直。 滑动这两个滑动条,就能调整窗口的大小

自定义快捷键,通过快捷键来操作滑动条,滑动条本身可以通过方向键和pageUp pageDown操作,但是咱们可以自定义

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

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

相关文章

C++自动驾驶面试核心问题整理

应用开发 概述:比较基础,没啥壁垒,主要有linux开发经验即可 问题:基础八股,如计算机网络、操作系统、c11等基础三件套;中等难度算法题1-2道。 中间件开发(性能优化) 概述&am…

Set 和 Map 的模拟实现

1、引言 在数据结构与算法的学习与实践中,关联容器(associative containers)是不可忽视的重要工具。作为高效管理数据的一类容器,C 标准库中的 set 和 map 在现代软件开发中扮演着关键角色。这两个容器通过平衡二叉搜索树&#x…

【通讯协议】S32K142芯片——LIN通信的学习和配置

文章目录 前言1.LIN是什么?2. LIN连接结构及节点构成3. 帧的组成3.1 帧头3.1.1 同步间隔场(Break)3.1.2 同步场(Synch)3.1.3 标识符场(PID) 3.2 帧响应3.2.1 数据场3.2.2 校验和场 3. 代码配置总…

【图灵完备 Turing Complete】游戏经验攻略分享 Part.6 处理器架构2 函数

新的架构来了,本游戏的最后一个攻略分享,最后汇编部分无非是对于操作码的熟练,硬件没有问题,那么也就无关痛痒了。 汇编实现,两数相或和两数相与非一起相与即可。 八位异或器,整就完事了。 有手就行。 利…

干货满满:嵌入式电阻的重要作用全知晓

在嵌入式开发中,有一个小小的元件,它看似不起眼,却在电路中扮演着极其重要的角色。它就是——电阻。很多初学者认为电阻只是用来“分压降流”,但其实,电阻的作用远比我们想象的要复杂和关键。今天,我们就来…

LeetCode 2374.边积分最高的节点:模拟

【LetMeFly】2374.边积分最高的节点:模拟 力扣题目链接:https://leetcode.cn/problems/node-with-highest-edge-score/ 给你一个有向图,图中有 n 个节点,节点编号从 0 到 n - 1 ,其中每个节点都 恰有一条 出边。 图…

思科安全网络解决方案

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

【门牌制作 / A】

题目 代码 #include <bits/stdc.h> using namespace std; int main() {int cnt 0;for (int i 1; i < 2020; i){string s;s to_string(i);cnt count(s.begin(), s.end(), 2);}cout << cnt; }

【C++篇】走进C++标准模板库:STL的奥秘与编程效率提升之道

文章目录 C STL 初探&#xff1a;打开标准模板库的大门前言第一章: 什么是STL&#xff1f;1.1 标准模板库简介1.2 STL的历史背景1.3 STL的组成 第二章: STL的版本与演进2.1 不同的STL版本2.2 STL的影响与重要性 第三章: 为什么学习 STL&#xff1f;3.1 从手动编写到标准化解决方…

【论文速看】DL最新进展20240923-长尾综述、人脸防伪、图像分割

目录 【长尾学习】【人脸防伪】【图像分割】 【长尾学习】 [2024综述] A Systematic Review on Long-Tailed Learning 论文链接&#xff1a;https://arxiv.org/pdf/2408.00483 长尾数据是一种特殊类型的多类不平衡数据&#xff0c;其中包含大量少数/尾部类别&#xff0c;这些类…

tomcat服务搭建部署ujcms网站

tomcat服务搭建部署ujcms网站 关闭selinux和防火墙 setenforce 0 && systemctl stop firewalld安装java环境 #卸载原有java8环境 yum remove java*#上传java软件包&#xff0c;并解压缩 tar -xf openjdk-11.0.1_linux-x64_bin.tar.gz && mv jdk-11.0.1 jdk11…

TaskRes: Task Residual for Tuning Vision-Language Models

文章汇总 当前VLMs微调中存在的问题 提示微调的问题 在提示调优中缺乏对先验知识保存的保证(me&#xff1a;即提示微调有可能会丢失预训练模型中的通用知识)。虽然预先训练的文本分支模块(如文本编码器和投影)的权重在提示调优范式中被冻结&#xff0c;但原始的良好学习的分类…

BUUCTF-MISC-荷兰宽带数据泄露

下载附件得到一个二进制文件 通过题目猜测这是一段路由器备份日志&#xff0c;可以使用RouterPassView打开 链接: https://pan.baidu.com/s/1tY5Sdl8GcI5dKQdhPXj5yA?pwdhi9k 下载链接http://pan.baidu.com/s/1tY5Sdl8GcI5dKQdhPXj5yA?pwdhi9k注意&#xff0c;这个软件会报毒…

struts2 S2-057远程执行代码漏洞 靶场攻略

环境 vulhub靶场 /struts2/s2-057 漏洞简介 漏洞产⽣于⽹站配置XML时如果没有设置namespace的值&#xff0c;并且上层动作配置中并没有设置 或使⽤通配符namespace时&#xff0c;可能会导致远程代码执⾏漏洞的发⽣。同样也可能因为url标签没 有设置value和action的值&…

react + antDesign封装图片预览组件(支持多张图片)

需求场景&#xff1a;最近在开发后台系统时经常遇到图片预览问题&#xff0c;如果一个一个的引用antDesign的图片预览组件就有点繁琐了&#xff0c;于是在antDesign图片预览组件的基础上二次封装了一下&#xff0c;避免重复无用代码的出现 效果 公共预览组件代码 import React…

JBoss EJBInvokerServlet CVE-2013-4810 反序列化漏洞

vulhub/jboss/JMXInvokerServlet-deserialization 1. 此漏洞存在于JBoss中 /invoker/JMXInvokerServlet 路径。访问若提示下载 JMXInvokerServlet&#xff0c;则可能存在漏洞&#xff1a; #创建class⽂件 javac -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCol…

Qt 模型视图(四):代理类QAbstractItemDelegate

文章目录 Qt 模型视图(四):代理类QAbstractItemDelegate1.基本概念1.1.使用现有代理1.2.一个简单的代理 2.提供编辑器3.向模型提交数据4.更新编辑器的几何图形5.编辑提示 Qt 模型视图(四):代理类QAbstractItemDelegate ​ 模型/视图结构是一种将数据存储和界面展示分离的编程方…

【C语言零基础入门篇 - 7】:拆解函数的奥秘:定义、声明、变量,传递须知,嵌套玩转,递归惊艳

文章目录 函数函数的定义与声明局部变量和全局变量、静态变量静态变量和动态变量函数的值传递函数参数的地址传值 函数的嵌套使用函数的递归调用 函数 函数的定义与声明 函数的概念&#xff1a;函数是C语言项目的基本组成单位。实现一个功能可以封装一个函数来实现。定义函数的…

DPDK 简易应用开发之路 3:实现ping(ARP ICMP 协议)

本机环境为 Ubuntu20.04 &#xff0c;dpdk-stable-20.11.10 网卡IP为192.168.131.153 mac地址 00 0c 29 00 04 4d 理论基础 机器A内部没有机器B的物理地址&#xff0c;则 A ping B 的时候需要先发 arp 请求&#xff0c;以获取机器 B 的 MAC 地址。 获取 MAC 地址 如果 A 和 …

python画图1

import matplotlib.pyplot as pltplt.rcParams["font.sans-serif"] ["SimHei"]# 模拟数据 years [2016, 2017, 2018, 2019, 2020, 2021, 2022] market_size [7950, 8931, 9940, 11205, 12305, 13199, 14980] my_color #3e9df5plt.plot(years, market_s…