Qt开发技巧(十)新版随机数,模拟鼠标移动,QTextEdit卡死问题,函数返回值,参数结构化,选项卡控件,窗体属性

news2024/11/18 3:19:32

继续讲一些Qt开发中的技巧操作:
1.新版随机数
Qt中有自己的随机数取值方法,Qt5.10以前使用qsrand方法, Qt5.10以后提供了新的类 QRandomGenerator QRandomGenerator64 管理随机数,使用更方便,尤其是取某个区间的随机数。

//早期处理办法 先初始化随机数种子然后取随机数
qsrand(QTime::currentTime().msec());
//取 0-10 之间的随机数
qrand() % 10;
//取 0-1 之间的浮点数
qrand() / double(RAND_MAX);

//新版处理办法 支持5.10以后的所有版本包括qt6
QRandomGenerator::global()->bounded(10); //生成一个0和10之间的整数
QRandomGenerator::global()->bounded(10.123); //生成一个0和10.123之间的浮点数
QRandomGenerator::global()->bounded(10, 15); //生成一个10和15之间的整数

//兼容qt4-qt6及以后所有版本的方法 就是用标准c++的随机数函数
srand(QTime::currentTime().msec());
rand() % 10;
rand() / double(RAND_MAX);

//通用公式 a是起始值,n是整数的范围
int value = a + rand() % n;
//(min, max)的随机数
int value = min + 1 + (rand() % (max - min - 1));
//(min, max]的随机数
int value = min + 1 + (rand() % (max - min + 0));
//[min, max)的随机数
int value = min + 0 + (rand() % (max - min + 0));
//[min, max]的随机数
int value = min + 0 + (rand() % (max - min + 1));

2.模拟鼠标移动
Qt的UI界面在resize以后有个BUG,悬停样式没有取消掉,就是说界面变化后,还停留在鼠标悬停的状态,需要主动模拟鼠标动一下。这种方式可以用在一些界面刷新后,状态未变动的问题。

 void frmMain::on_btnMenu_clicked()
{
......
//有个BUG,当按钮操作界面变化后,悬停样式没有取消掉,需要主动模拟鼠标动一下
QEvent event(QEvent::Leave);
QApplication::sendEvent(ui->btnMenu_Max, &event);
}

3.QTextEdit卡死问题
Qt的文本控件比如QTextEdit默认加载大文本比如10MB的文本,很容易卡死甚至崩溃,那是因为默认undoRedoEnabled这个属性开启了,只要屏蔽掉就好很多。这个属性是用于开启undo撤消和redo重做的。关掉这个属性,就会释放出一些预留的空间,QTextEdit自然也就不那么卡了。
可以用代码关闭

ui->textEdit->setUndoRedoEnabled(false);

也可以在设计器里边关闭
在这里插入图片描述
4.函数返回值
如果你的函数声明和定义时设置了返回值,那么一定要确保函数退出时return对应的返回值。有部分编译器在没有返回值的情况下也能正常编译通过,不会给你报错,但是运行的时候会出问题,甚至崩溃。我就不慎踩了好几次这个坑,函数里边忘了return,编译不报错,结果,一调用到这个函数立马崩溃。
你可以试试这样:

int MainWindow::testFun()
{
    int nRet = 0;
    //return nRet;
}

一段简单测试代码,专门去掉返回值,你会发现widows上编译报错,Linux上编译不报错。
Windows上编译报错
Linux上编译通过
5.参数结构化
有时候我们定义一些函数时,设定的参数很多,后期可能还会修改和增加,一旦要修改增删,那么源头修改以后,关联信号槽的地方也要修改,参数类型和位置必须保持完全一致,对应槽函数处理胡总和调用方也要修改等,改动的工作量非常大而且极不友好。这时候,我们可以考虑将这些参数做成一个结构体或者类,这样非常容易增加其他的参数,而且不用修改信号槽关联和信号槽函数定义等,比如学生姓名、年龄,性别等信息表作为参数传输,最佳方案就是将这些参数合在一个结构体或者类中,做一个数据类型来传输。

//"StudentInfo"结构体包含学生各项信息
bool showStudentData(const int& nIndex, const StudentInfo& studentInfo)
{
	ui->labelName.setText(studentInfo.name);
	ui->labelSix.setText(studentInfo.six);
	ui->labelAge.setText(studentInfo.age);
}

6.选项卡控件
QTabWidget选项卡控件,生成的tabbar选项卡宽度是按照文本自动设置的,文本越长选项卡的宽度越大,很多时候,我们需要的是一样的宽度或者等分填充。

//方法1:字符串空格填充
ui->tabWidget->addTab(httpClient1, "测 试");
ui->tabWidget->addTab(httpClient1, "人员管理");
ui->tabWidget->addTab(httpClient1, "系统设置");
//方法2:识别尺寸改变事件自动设置最小宽度
void MainWindow::resizeEvent(QResizeEvent *e)
{
int count = ui->tabWidget->tabBar()->count();
int width = this->width() - 30;
QString qss = QString("QTabBar::tab{min-width:%1px;}").arg(width / count);
this->setStyleSheet(qss);
}
//方法3:设置全局样式,不同选项卡个数的设置不同的宽度
QStringList list;
list << QString("QTabWidget[tabCount=\"2\"]>QTabBar::tab{minwidth:%1px;}").arg(100);
list << QString("QTabWidget[tabCount=\"3\"]>QTabBar::tab{minwidth:%1px;}").arg(70);
qApp->setStyleSheet(list.join(""));
//设置了tabCount弱属性自动去找对应的宽度设置
ui->tabWidget->setProperty("tabCount", 2);
ui->tabWidget->setProperty("tabCount", 3);
//方法4:强烈推荐-》使用内置的方法 setExpanding setDocumentMode 两个属性都必须设置
//Qt4的tabBar()是propected的,所以建议还是通过样式表设置
ui->tabWidget->tabBar()->setDocumentMode(true);
ui->tabWidget->tabBar()->setExpanding(true);
//样式表一步到位不用每个都单独设置
QString("QTabBar{qproperty-usesScrollButtons:false;qpropertydocumentMode:true;qproperty-expanding:true;}");

7.窗体属性
Qt提供了N种窗体属性比如无边框属性FramelessWindowHint、不在任务栏显示属性Tool等,有时候我们需要对窗口的属性进行动态设置,比如增加一个属性或者移除一个属性,Qt5.9以前需要拿到原有的窗体属性做运算,Qt5.9以后可以用新的方法。

//增加一个无边框属性
setWindowFlags(windowFlags() | Qt::FramelessWindowHint);
//移除无边框属性
setWindowFlags(windowFlags() & ~Qt::FramelessWindowHint);
//下面是5.9以后新增的方法
//增加一个无边框属性到窗体属性链表
setWindowFlag(Qt::FramelessWindowHint, true);
//从窗体属性链表中移除无边框属性
setWindowFlag(Qt::FramelessWindowHint, false);

窗体属性的各个属性很多,可以都试试他们呈现出什么样子。
在这里插入图片描述

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

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

相关文章

【尚跑】2024铜川红色照金半程马拉松赛,大爬坡152安全完赛

1、赛事背景 2024年9月22日8点&#xff0c;2024铜川红色照金半程马拉松赛于照金1933广场鸣枪起跑&#xff01; 起跑仪式上&#xff0c;6000位选手们合唱《歌唱祖国》&#xff0c;熟悉的旋律响彻陕甘边革命根据地照金纪念馆前&#xff0c;激昂的歌声凝聚心中不变的热爱。随着国…

短视频矩阵系统源码图--示例

短视频矩阵系统源码通常指的是用于构建和管理短视频平台的一整套软件代码。这些代码包括了前端用户界面、后端服务器逻辑、数据库设计以及可能的移动应用客户端等部分。源码是软件的原始代码&#xff0c;开发者可以通过阅读和修改源码来定制或增强系统的功能。 开发短视频矩阵系…

第一弹:llama.cpp编译

1.编译llama.cpp命令行&#xff08;电脑版本&#xff09;&#xff1b; 2.交叉编译安卓命令行版本。 一、Llama.cpp是什么&#xff1f; 二、Llama.cpp编译 首先我们尝试编译llama.cpp. 2.1 下载llama.cpp 项目的github地址&#xff1a; https://github.com/ggerganov/llama…

PMP--二模--解题--151-160

文章目录 14.敏捷–流程&#xff1a;151、 [单选] 在每日站会上&#xff0c;项目负责人注意到一位资深开发人员正在将一些简单的待办事项重新分配给其他团队成员&#xff0c;理由是让资深开发人员处理复杂事项更有效率。项目负责人应该怎么做&#xff1f; 14.敏捷--通才型专家-…

0基础跟德姆(dom)一起学AI 机器学习01-机器学习概述

【知道】人工智能 - Artificial Intelligence 人工智能 - AI is the field that studies the synthesis and analysis of computational agents that act intelligently - AI is to use computers to analog and instead of human brain - 释义 - 仿智&#xff1b; 像人…

【多线程】多线程(4)(线程安全问题的原因,如何解决线程安全问题)

【线程安全问题的原因&#xff08;重点掌握&#xff09;】 1.线程在操作系统中:随机调度&#xff0c;抢占式执行&#xff08;核心原因&#xff09; 2.多个线程同时修改一个变量 3.修改操作「不是原子的」 4.内存可见性 5.指令重排列 &#xff08;后两个原因后面再谈&…

多元函数微分学基础题

这是基础题&#xff01;&#xff01;原则上必须要在第一轮初学并做完课后习题之后再做这个基础题&#xff0c;不能有错误&#xff08;马虎大意除外&#xff09;或无法解答。如有错误&#xff0c;该单元需要重学&#xff01;&#xff01; 多元函数微分学填空题 一、填空题 如…

基于SPI协议的Flash驱动控制

1、理论知识 SPI&#xff08;Serial Peripheral Interface&#xff0c;串行外围设备接口&#xff09;通讯协议&#xff0c;是Motorola公司提出的一种同步串行接口技术&#xff0c;是一种高速、全双工、同步通信总线&#xff0c;在芯片中只占用四根管脚用来控制及数据传输&#…

关于Fake Location定位,运动世界校园问题

不好意思&#xff0c;之前那个文章其实是很早之前的&#xff0c;不知道为什么审核了很久一直没有通过&#xff0c;然后前几周莫名其妙点了一下重新发布&#xff0c;竟然发布成功了&#xff0c;这个方法已经失效了&#xff0c;要可以稳定&#xff0c;我建议是买一台root的手机&a…

Element-Plus中上传文件upload取消提示按钮与文字

去除提示按钮与文字 添加样式&#xff0c;让这个div进行隐藏 .el-upload__input {display: none !important; }

单片机长短按简单实现

单片机长短按简单实现 目录 单片机长短按简单实现1 原理2 示例代码2.1 按键实现 3 测试log4 其他实现方式 1 原理 按键检测和处理的步骤如下&#xff1a; 1&#xff1a;定时扫描按键&#xff08;使用定时器定时扫描&#xff0c;也可以用软件延时或者系统心跳之类的方式&#…

【动态规划-分组背包】力扣1981. 最小化目标值与所选元素的差

给你一个大小为 m x n 的整数矩阵 mat 和一个整数 target 。 从矩阵的 每一行 中选择一个整数&#xff0c;你的目标是 最小化 所有选中元素之 和 与目标值 target 的 绝对差 。 返回 最小的绝对差 。 a 和 b 两数字的 绝对差 是 a - b 的绝对值。 示例 1&#xff1a; 输入…

DAY17||654.最大二叉树 |617.合并二叉树 |700.二叉搜索树中的搜索 |

654.最大二叉树 题目&#xff1a;654. 最大二叉树 - 力扣&#xff08;LeetCode&#xff09; 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下&#xff1a; 二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树…

物联网系统中TFT_LCD屏主流驱动方案详解

01 物联网系统中为什么要使用TFT-LCD驱动芯片 在物联网系统中使用TFT-LCD&#xff08;薄膜晶体管液晶显示器&#xff09;驱动芯片的原因主要可以归纳为以下几点&#xff1a; 专业性与高效性 1、专业图形处理&#xff1a;TFT-LCD驱动芯片内置了专业的图形处理引擎&#xff0…

全功能运营级开源跨境电商平台源码 —— 多语言全球化商城解决方案

实测分享【全功能运营级开源跨境电商平台】&#xff0c;它不仅默认集成了中英文双语系统&#xff0c;更内置了强大的翻译接口&#xff0c;支持自动翻译至全球133种语言&#xff0c;为商家打开通往世界的窗口。 核心特性亮点解析&#xff1a; 多语言自动翻译&#xff1a;该平台…

WEB 编程:富文本编辑器 Quill 配合 Pico.css 样式被影响的问题之还是 iframe

这个系列已经写了 3 篇了。这篇写如何使用 iframe 解决标题里面提到的问题。 前情提要 请看上一篇博文&#xff1a; WEB 编程&#xff1a;富文本编辑器 Quill 配合 Pico.css 样式被影响的问题之Shadow DOM WEB 编程&#xff1a;富文本编辑器 Quill 配合 Pico.css 样式被影响…

常见字符函数和字符串函数(上)

1. 字符分类函数 字符分类函数是一类用于判断字符是否属于特定的字符类别&#xff08;如字母、数字、标点符号等&#xff09;的函数。在C语言中&#xff0c;这些函数通常可以在<ctype.h>头文件中找到&#xff0c;它们对于文本处理和输入验证非常有用。 这些函数通常返回…

Windows系统镜像下载

目前官网还可以下载的系统有Win10和Win11&#xff0c;Win7因为已经停止维护&#xff0c;所以只能到第三方镜像站下载&#xff0c;下面将具体展示下载方法。 Win7 下载地址&#xff1a;MSDN, 我告诉你 - 做一个安静的工具站 在操作系统中找到Windows 7&#xff0c;在右侧选择…

Python | Leetcode Python题解之第445题两数相加II

题目&#xff1a; 题解&#xff1a; class Solution:def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:if head is None or head.next is None:return headnew_head self.reverseList(head.next)head.next.next head # 把下一个节点指向自己head…

魔都千丝冥缘——软件终端架构思维———未来之窗行业应用跨平台架构

一、创生-魔都千丝冥缘 在那神秘而复杂的数字世界里&#xff0c;软件的舞台上正上演着一场精彩的剧目。当面对终端单页面中如蛛网般交织的复杂业务逻辑&#xff0c;我们如同在迷雾中摸索前行。多个表单承载着各自的使命&#xff0c;却又有着相同字段的微妙关联&#xff0c;而内…