当前位置: 首页 > news >正文

初学Qt(Day03)

今天概览

今天的目标是写一个动态的彩虹灯
一开始是有思路的。只是写的过程中有太多小bug了,真的是防不胜防
我的思路是:
主界面是一个开始界面,点击开始按钮之后,有一个子界面出现,显示出彩虹灯转动的效果。
内部的执行逻辑是
创建一个名为开始的Pushbutton,在用户点击了pushbutton的时候,使用connect函数来发信号到槽当中,执行槽函数,在这个槽函数中:
为一个子窗口申请内存,使用show函数。
这样程序就进入到了这个子窗口的构造函数中,构造函数中初始化了一个存放七个颜色的Label数组,分别代表彩虹的七种颜色。然后分别初始化这七个元素,使用布局将这七个颜色放到一起,目的是可以达到七个颜色一起滚动的效果,然后在为定时器分配完内存之后就可以在槽函数中设置重复动作了,因为我当时设置的是向上滚动,事实证明这的确是最省力的hhhh,然后使用一个计数器,每次执行一次函数就自增1,然后对这个计数器模6取余,这样就可以使用数组下标对布局中的Label进行设置了.如何设置呢:使用下标首先移除布局中的对应下标,之后再执行add操作,因为往布局中添加组件,QT是默认往下添加的。所以这就不需要再指定插入到哪个位置了。
上面说的这个计数器一定得是静态的,否则就需要定义在函数外面作为一个全局函数使用。说到这个我就想起上上周电话面试的时候
面试官:全局变量在C++中是如何定义的
我:放在main函数外面就是全局变量了
面试官:嗯,还有呢?放在函数里面呢?
我:嗯?额额额,static?final?
沉默。。。
面试官:好了,C++部分我就不提问了,嗯我看一下(估计当时是在看我的简历)…好那我提问一下关于计算机网络的问题巴拉巴拉巴拉。。。。
哎,现在想起来真是尴尬的要命了。。。

对了今天做彩虹灯的主要目的就是熟悉计时器,忘记说了,我个人觉得QT里面的定时器和linux里面的定时器挺像的。

反正最后也是做出来了,我自己感觉是挺好看的。滚动的
![在这里插入图片描述](https://img-blog.csdnimg.cn/05f621cfa0f24459b6263138e0e1e54b.gif =720x300#pic_center)

关于定时器的槽函数

忘记了计时器的槽函数是一个重复执行的函数。也因为这样,我以为槽函数就直接是一个函数,里面重复处理同一个流程,不过现在明白过来了也觉得:为什么要专门创造一个定时器,就是因为定时器槽函数的作用就是让这个槽函数在定时器的作用下自己重复执行,要不然和自己设置一个可以循环的函数有什么区别呢?

qt的定时器和linux里的定时器

Qt中的定时器和Linux中的定时器有一些区别。

首先,Qt中的定时器是基于事件循环(Event Loop)机制实现的,而Linux中的定时器通常是基于系统调用和信号机制。在Qt中,我们可以使用定时器类QTimer来设置定时器,并将相应的事件(如定时器超时事件)添加到事件队列中等待处理。而在Linux中,我们通常使用系统调用timer_create()或setitimer()来创建定时器,或者使用信号SIGALRM来处理定时器超时事件。

其次,Qt中的定时器可以在不同的线程中使用,而Linux中的定时器通常只能在单个进程中使用。在Qt中,我们可以通过设置QObject::moveToThread()函数将某个对象移动到另一个线程中,并在该线程中启动定时器,从而实现在多个线程中同时使用定时器。而在Linux中,由于进程之间的资源隔离性,不同进程之间的定时器无法互相访问和共享。

最后,Qt中的定时器还提供了一些方便的功能,如单次定时器、重复定时器、定时器延迟启动、定时器暂停/恢复等,使得开发者可以更加灵活地控制定时器的行为。而在Linux中,需要自己手动实现这些功能,增加了开发难度和工作量。

总之,Qt中的定时器是一种高级抽象,提供了更加简单、易用、灵活的定时器机制,便于开发者编写高质量的应用程序。而Linux中的定时器则更加底层,需要开发者自己处理复杂的系统调用和信号机制,适合编写更底层的系统程序和驱动程序。
Qt中的定时器和Linux中的定时器之间也有一些相同点。其中最重要的一个相同点就是它们都可以用于处理定时事件。

定时器在计算机领域中广泛应用,例如实现延时操作、周期性任务调度、实时数据采集等。Qt中的定时器和Linux中的定时器都可以满足这些需求,具有相似的功能和表现形式。

另外,Qt中的定时器和Linux中的定时器都是基于系统底层硬件或操作系统内核提供的计时器实现的,在CPU时钟周期内部使用计数器来计量时间间隔,从而精确地计算出定时器超时事件。

总之,虽然Qt中的定时器和Linux中的定时器在实现方式和功能特性上存在差异,但它们的共同点在于都能够为程序提供高效、精确的定时服务,帮助开发者实现各种定时相关的功能和应用场景。

在继承QMainWindow需要注意的事项

因为在使用子窗口的时候,我的想法是直接在主窗口中出现彩虹灯,按照想法写出来之后,看了又看的确是没问题,但是就是显示说已经有另一个布局覆盖了整个窗口了,没办法使用另外一个窗口
然后我就这个查这个问题查了一个小时,最后终于找到答案,因为我的子窗口继承的QMainWindow,但是QMainWindow这个类是默认创建了一个布局的,所以没有办法再使用子布局了。

给一个gpt的回答:
据说继承QMainWindow的一个控件会隐式创建一个布局,有可能导致之后继承这个控件的窗口无法显示是这样吗?

不完全是这样。

确实,继承自 QMainWindow 的控件(如 QMainWindow、QDialog 等)会隐式创建一个布局,并将其设置为自身的布局。这个布局被称为 central widget 布局,它对插入到其中的所有子控件进行管理,以便正确地显示它们。

但是,这并不会导致之后继承这个控件的窗口无法显示。如果您继承了 QMainWindow 或 QDialog,而子类中的窗口无法显示,那么通常有其他原因导致的,例如:

没有将子控件添加到布局中:如果您没有将子控件添加到 central widget 布局中,则子控件将不会显示。您需要使用 setCentralWidget() 函数将子控件设置为 QMainWindow 的中央窗口部件。
子控件的大小超过了父控件的大小:如果子控件的大小超过了父控件的大小,它将被裁剪,只显示可见部分。确保子控件的大小不超过父控件的大小。
子控件的属性设置不正确:如果您在创建子控件时没有正确设置其属性,例如不合适的大小策略或伸缩性质,它可能无法正确地显示。
其他布局管理问题:如果您在布局管理中存在问题,例如布局类型设置不正确或缺少必要的约束条件,它也可能导致子控件无法显示。
因此,如果您在使用 QMainWindow 或 QDialog 时遇到了问题,请仔细检查代码中是否存在上述问题,并进行相应的修正。
所以说在这种时候,如果要创建一个在这个控件中的布局就需要明确的使用centralWidget设置这个布局是吗

是的,如果您想要在 QMainWindow 或 QDialog 中创建一个子控件布局,您需要将该布局设置为 central widget 的布局。

在 QMainWindow 类中,setCentralWidget() 函数用于设置 central widget,该函数接受一个 QWidget 参数。您可以将一个包含子控件的 QWidget 作为参数传递给这个函数,从而将子控件添加到中心窗口部件中。

关于handler和槽函数

另外之前看有人说QT里面的信号和槽与linux里面的handler(回调函数)不相同。
但是实际上我觉得他们的本质是相同的都是在运行时如果遇到了放置在相应位置上的函数指针,那么程序流程就转换到函数指针指向的函数中,执行完之后再返回继续执行主程序。但是与handler不同的是,信号和槽机制是使用connect连接信号和槽,在connect中发出信号之后,相当于是广播给了消息队列中所有的槽函数,如果槽函数的名字或什么标志(可能是看这个槽函数的父窗口/控件)和connect相对应,那么就执行这个槽函数。主要的不同就是qt有内置的消息队列(也就是事件循环),而且这个消息队列可以开发者自己设置优先级。
这里再贴一个关于事件循环的gpt的回答:
是的,Qt内置了消息队列(Message Queue),也称为事件循环(Event Loop),用于处理应用程序接收到的各种事件,如鼠标点击、键盘输入、定时器等事件。

在Qt中,事件循环是由QCoreApplication或QApplication类的exec()函数所实现的。当运行应用程序时,Qt会自动创建一个主线程,并在主线程中启动一个事件循环,用于接收和处理事件。当应用程序接收到事件时,例如鼠标点击事件,Qt会将该事件封装成一个QEvent对象,并将其添加到事件队列中。事件循环会不断地从事件队列中取出事件,并将其分发给相应的对象处理。如果没有任何事件需要处理,事件循环会一直等待,直至有新事件加入事件队列。

通过事件循环,Qt可以方便地实现多线程程序、异步编程,以及优化应用程序的性能和响应速度等。

同时,在事件循环中,Qt还提供了一些方便的函数,如postEvent()、sendEvent()、processEvents()等,允许开发者手动向事件队列中添加事件、立即处理事件,或者强制事件循环执行一定时间的事件处理等。

总之,Qt内置的消息队列和事件循环是Qt架构的重要部分,使得Qt应用程序能够优雅地处理各种事件,保证了应用程序的稳定性和可靠性。

另外

晚上又运行了一遍彩虹灯,发现在我电脑上运行竟然发生了频闪,我觉得可能是我自己电脑的问题

剩下的想起来再写吧

今天实在是太充实了,不过没做学校布置的大作业,哎晚上回去又要加班了

相关文章:

初学Qt(Day03)

今天概览 今天的目标是写一个动态的彩虹灯 一开始是有思路的。只是写的过程中有太多小bug了,真的是防不胜防 我的思路是: 主界面是一个开始界面,点击开始按钮之后,有一个子界面出现,显示出彩虹灯转动的效果。 内部的执…...

皮卡丘xss之htmlspecialchars、xss之href输出、xss之js输出

1.xss之htmlspecialchars htmlspecialchars()函数的功能如下: htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。 预定义的字符是: (1)& (和号)成为 & (2)…...

ArrayList和LinkedList的区别

ArrayList和Vector使用了数组的实现,可以认为ArrayList或者Vector封装了对内部数组的操作,比如向数组中添加,删除,插入新的元素或者数据的扩展和重定向。 LinkedList使用了循环双向链表数据结构。与基于数组ArrayList相比&#xf…...

记录 vue3 webpack 使用 iframe 遇到的坑

需求 我尝试用Vue3写一个自己的主页,把常用的功能集中到主页中,如下图 后发现一个好玩的东西,js实现的在网页底部出现鱼和波浪,如下图,就像想也放到自己的主页中,搜索后发现可以在Vue中用iframe标签直接引…...

华为OD机试真题 Java 实现【去除多余空格】【2023Q1 100分】

一、题目描述 去除文本多余空格,但不去除配对单引号之间的多余空格。给出关键词的起始和结束下标,去除多余空格后刷新关键词的起始和结束下标。 条件约束: 不考虑关键词起始和结束位置为空格的场景;单词的的开始和结束下标保证涵盖一个完整的单词,即一个坐标对开始和结束…...

SAP-MM 条件类型字段解析

01、“定价类型”:定义此条件类型的代码和描述,代码不能重复,描述可更改,根据实际需要,条件类型可定制; 02、“存取顺序”:表示此条件类型在定价时,要到存取顺序号定义的条件表中读…...

C#,码海拾贝(28)——求解“对称正定方程组”的“平方根法”之C#源代码

using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 求解线性方程组的类 LEquations /// 原作 周长发 /// 改编 深度混淆 /// </summary> public static partial class LEquations { /// <summary> /…...

碳纤维单丝外径测试中的纳米分辨率激光衍射法解决方案

摘要&#xff1a;碳纤维单丝热膨胀系数是碳纤维复合材料设计、生产与可靠性和寿命评估的重要参数&#xff0c;本文针对单丝径向高温热膨胀系数测试这一难题提出了相应的解决方案。解决方案的核心内容是基于激光衍射法和高温辐射加热&#xff0c;并采用衍射轮廓拟合技术以及相应…...

服务(第三十二篇)nginx做缓存服务器

nginx作为缓存服务配置语法 1、proxy_cache_path 配置语法&#xff08;即缓存路径配置语法&#xff09; Syntax&#xff1a;proxy_cache_path path [levelslevels] [use_temp_pathon|off] keys_zonename:size [inactivetime] [max_sizesize] [manager_filesnumber] [manager_s…...

Java 集合、数组、字符串的相互转换(关于list.toArray(new String[0])的源码分析)

在 Java 中&#xff0c;可以通过以下方式实现集合、数组和字符串之间的相互转换。 一、集合和数组的相互转化 ①、将集合转为数组&#xff1a;&#xff08;toArray 方法&#xff09; List<String> list new ArrayList<>(); list.add("apple"); lis…...

Redis的全局命令及相关误区

Redis中所说的数据结构是针对key-value中的value而言的。主要的结构包括String、哈希表、列表、集合等等在redis中存在16个库&#xff0c;涉及到后期的集群搭建只能使用0号库最为方便 查看所有键&#xff08;支持通配符&#xff09; keys * keys S*返回当前数据库中的键总数 …...

C++核心编程—类和对象,类的三大特性——封装、继承、多态

纵有疾风起&#xff0c;人生不言弃。本文篇幅较长&#xff0c;如有错误请不吝赐教&#xff0c;感谢支持。 &#x1f4ac;文章目录 一.类和对象的概念①什么是对象&#xff1f;②抽象和类1.类的基本概念2.类的声明与定义&#xff1a;3.对象的创建与使用 二.类的封装①为什么有封…...

keep-alive 是 Vue 内置的一个组件,被用来缓存组件实例。

文章目录 简介注意点使用 keep-alive 有以下优缺点优点缺点 简介 keep-alive 是 Vue 内置的一个组件&#xff0c;被用来缓存组件实例。 使用 keep-alive 包裹动态组件时&#xff0c;被包裹的组件实例将会被缓存起来&#xff0c;而不会被销毁&#xff0c;直到 keep-alive 组件…...

(八)Spring之IOC控制反转、DI依赖注入介绍和使用(详解)

文章目录 前言SpringSpring IOC 简介BeanIOC 概述IOC 本质理解 Spring IOC 应用IOC xml装配IOC 依赖注入IOC Bean的作用域 IoC 自动装配Bean 的自动装配注解实现自动装配 IoC 使用注解开发模拟实现Spring IoC 前言 “Spring”在不同的上下文中表示不同的事物。它可以用来引用 …...

凸缺陷 convexityDefects

获取凸包&#xff0c;可以参考我的这篇文章&#xff1a; 凸包&#xff08;Convex Hull&#xff09;代码实现案例 获取了凸包之后&#xff0c;可以干什么呢&#xff1f; 凸缺陷凸包与轮廓之间的部分称为凸缺陷。凸缺陷可用来处理手势识别等问题。 通常情况下&#xff0c;使用如…...

c语言编程练习题:7-43 Shuffling Machine

Shuffling is a procedure used to randomize a deck of playing cards. Because standard shuffling techniques are seen as weak, and in order to avoid “inside jobs” where employees collaborate with gamblers by performing inadequate shuffles, many casinos empl…...

ffmpeg enum AVChannel枚举解析

AVChannel枚举是在2022-12-20的提交中添加的&#xff0c;对应的版本号是5.1. 这个提交的描述是"avutil/channel_layout: add AVChannel enum and related functions"。 原型 typedef struct AVChannelCustom {enum AVChannel id;char name[16];void *opaque; } AVCh…...

invest模型教程

详情点击链接&#xff1a;invest模型教程——建议收藏 1.生态系统服务 2.InVEST模型 3.InVEST所需数据&#xff08;分辨率、格式、投影系统等&#xff09;、获取及标准化预处理 4.InVEST运行 5.ArcGIS工具支撑InVEST模型 5.1ArcGIS数据形式与数据格式、数据格式之间的相互转换…...

LinuxShell编程

Shell编程 Shell的概念介绍 命令解释器 Shell是命令解释器(command interpreter)&#xff0c;是Unix操作系统的用户接口&#xff0c;程序从用户接口得到输入信息&#xff0c;shell将用户程序及其输入翻译成操作系统内核&#xff08;kernel&#xff09;能够识别的指令&#x…...

stm32学习笔记-11 SPI通信

11 SPI通信 文章目录 11 SPI通信11.1 SPI通信协议11.2 W25Q64简介11.3 实验&#xff1a;软件SPI读写W25Q6411.4 SPI通信外设11.5 实验&#xff1a;硬件SPI读写W25Q64 注&#xff1a;笔记主要参考B站 江科大自化协 教学视频“ STM32入门教程-2023持续更新中”。 注&#xff1a…...

“微商城”项目(3页面布局)

1.设置标题 设置页面头部标题&#xff0c;方便告诉用户当前显示的是哪一个页面。编辑src\router.js文件&#xff0c;示例代码如下。 routes: [{ path: /, redirect: /home, meta: { title: 首页 } },{ path: /home, component: Home, name: home, meta: { title: 首页 } } ] …...

Java 八股文 - MySQL

MySQL 1. MySQL 有几种锁&#xff1f; ​ 三种锁的特点 表级锁&#xff1a;开销小&#xff0c;加锁快&#xff1b;不会出现死锁&#xff1b;锁定颗粒度大&#xff0c;发生锁冲突的概率最高&#xff0c;并发度最低。行级锁&#xff1a;开销大&#xff0c;加锁慢&#xff1b;会…...

周赛347(模拟、思维题、动态规划+优化)

文章目录 周赛347[2710. 移除字符串中的尾随零](https://leetcode.cn/problems/remove-trailing-zeros-from-a-string/)模拟 [2711. 对角线上不同值的数量差](https://leetcode.cn/problems/difference-of-number-of-distinct-values-on-diagonals/)模拟 [2712. 使所有字符相等…...

String AOP的使用

面向切面编程&#xff0c;面向特定方法编程&#xff0c;以方法为对象&#xff0c;在不修改原方法的基础上&#xff0c;对方法进行操作扩展等&#xff0c;底层是通过动态代理实现的 使用开发步骤&#xff1a; 1、创建一个类&#xff0c;加上Aspect声明为一个AOP切面类&#xff…...

华为芯片基地旁,龙华科技小镇大水坑片区城市更新单元旧改项目

项目位置&#xff1a;龙华观澜大水坑社区&#xff0c;位于梅观创新走廊九龙山产学研片区内 占地面积&#xff1a;总面积198万平方米&#xff0c;其中项目第一期60万平米开 发 商&#xff1a; 华润集团申报主体&#xff1a;华润置地项目&#xff1a;龙华科技小镇大水坑片区城市…...

论文阅读 | 频谱监测、认知电子战、网电攻击

文章目录 1.《超短波信号的频谱监测与信号源定位》1.1 信号预处理技术1.2 对指定频段的宽带信号截获、分析以及频率分选研究1.3 对指定频段的信号进行最佳分频段扫描分析并还原原信号1.4 总结2.《认知电子战理论及关键技术研究》2.1 认知电子战发展现状2.2 认知电子战发展趋势分…...

MySQL server安装记录

1 安装Notepad 运行下载的 npp.7.9.Installer.x64.exe 2 安装MySQL 将mysql-8.0.22-winx64.zip解压缩&#xff0c;我将其放置D盘根目录下。 进入文件夹&#xff0c;在目录中新建文件夹data和文件my.ini 用NotePad打开my.ini&#xff0c;输入以下内容并保存&#xff0c;其中目…...

平衡树原理讲解

平衡树——Treap 文章目录 平衡树——TreapBST定义性质操作插入insert(o, v)删除del(o, v)找前驱 / 后继get_prev(o)、get_next(o)查找最大 / 最小值get_min(o)、get_max(o)求元素排名get_rank(o)查找排名为 k k k的元素get_value_by_rank 平衡树左旋、右旋zag(o)、zig(o)左旋右…...

SpringMVC框架面试专题(初级-中级)-第七节

欢迎大家一起探讨&#xff5e;如果可以帮到大家请为我点赞关注哦&#xff5e;后续会持续更新 问题&#xff1a; 1.Spring MVC框架中的注解是什么&#xff1f;请举例说明如何使用注解。 解析&#xff1a; Spring MVC是一个基于MVC&#xff08;Model-View-Controller&#xf…...

爬虫实战案例

预计更新 一、 爬虫技术概述 1.1 什么是爬虫技术 1.2 爬虫技术的应用领域 1.3 爬虫技术的工作原理 二、 网络协议和HTTP协议 2.1 网络协议概述 2.2 HTTP协议介绍 2.3 HTTP请求和响应 三、 Python基础 3.1 Python语言概述 3.2 Python的基本数据类型 3.3 Python的流程控制语句 …...