Qt开发技巧(九)去掉切换按钮,直接传样式文件,字体设置,QImage超强,巧用Qt的全局对象,信号槽断连,低量数据就用sqlite

news2024/11/17 23:56:35

继续讲一些Qt开发中的技巧操作:
1.去掉切换按钮
QTabWidget选项卡有个自动生成按钮切换选项卡的机制,有时候不想看到这个烦人的切换按钮,可以设置usesScrollButtons为假,其实QTabWidget的usesScrollButtons属性最终是应用到QTabWidget的QTabBar对象上,所以只要设置全局的QTabBar的这个属性关闭即可。为啥要设置全局的呢,因为如果只是对QTabWidget设置了该属性,而在QMainWindow窗体中QDockWidget合并自动形成的选项卡只有QTabBar对象导致依然是有切换按钮。

//对tabWidget设置无切换按钮
ui->tabWidget->setUsesScrollButtons(false);
//对tabBar设置无切换按钮
ui->tabWidget->tabBar()->setUsesScrollButtons(false);
//对整个系统的选项卡设置无切换按钮
QTabBar{qproperty-usesScrollButtons:false;}
//设置选项卡自动拉伸 这玩意居然之前自动计算来设置原来内置了哇咔咔
QTabBar{qproperty-expanding:false;}
//设置选项卡关闭按钮可见
QTabBar{qproperty-tabsClosable:true;}
//还有其他属性参见QTabBar头文件有惊喜
//依旧是万能大法所有可视化类的 Q_PROPERTY 包含的属性都可以这样设置

2.直接传样式文件
Qt设置样式表支持直接传入样式表文件路径,亲测4.7到5.15任意版本,通过查看对应函数的源码可以看到内部会检查是否是 ‘file:///’ 开头,是的话则自动读取样式表文件进行设置,无需手动读取。

//以前都是下面的方法
QFile qss(":/qss/qssStyle/MainStyle.qss");
    if (qss.open(QFile::ReadOnly))
    {
        QString style = QLatin1String(qss.readAll());
        this->setStyleSheet(style);
        qss.close();
    }
    else
    {
        WriteLocalLog("qss open failed");
    }
//其实一行代码就行
qApp->setStyleSheet("file:///:/qss/qssStyle/MainStyle.qss");
//特别说明,只支持qApp->setStyleSheet 不支持其他比如widget->setStyleSheet
//像下面这样就不行
ui->widget->setStyleSheet("file:///:/qss/qssStyle/MainStyle.qss");

3.设置字体
在Qt中设置字体这块,我们经常都会经历一个误区,本来是打算设置整个窗体包括子控件的字体大小的,结果发现只有主窗体自己应用了字体而子控件没有,其实是我们需要搞清楚我们设置给了谁。

//假设继承自父类类型QWidget的窗体myWidget作为主窗体,myWidget中有QLabel,QPushButton等子控件,默认字体12px
//下面几种方法只会设置主窗体的字体,子控件不会应用,需要按个调用setFont
QFont font;
font.setPixelSize(20);
this->setFont(font);
this->setStyleSheet("{font:26px;}");
//this设置给了QWidget类型的窗体
this->setStyleSheet("QWidget{font:26px;}");
//this设置给了myWidget的窗体
this->setStyleSheet("myWidget{font:26px;}");

//下面才是通过样式表设置整个控件+子控件的字体
this->setStyleSheet("font:26px;");
this->setStyleSheet("*{font:26px;}");
this->setStyleSheet("QWidget>*{font:26px;}");
this->setStyleSheet("myWidget>*{font:26px;}");
//下面设置全局字体,因为qApp是代表整个应用程序的
qApp->setFont(font);

4.QImage超强
Qt中封装的QImage异常的强大,提供了各种图片格式的转换,还可以对每个像素的颜色值进行替换,有时候我们需要将单色的图片换成另外一种颜色,要注意的是如果带有透明值的颜色需要进行格式转化,比如转成Format_ARGB32或者Format_RGBA8888

//pixel 函数获取像素点的颜色 setPixel 函数设置像素点的颜色 此函数任意Qt版本都有
//pixelColor 函数获取像素点的颜色 setPixelColor 函数设置像素点的颜色 此函数Qt5.6以后才有
//pixel函数取出来的是QRgb格式需要用 qRed qGreen qBlue qAlpha 进行转换
QImage image("test.png");
image = image.convertToFormat(QImage::Format_ARGB32);
int width = image.width();
int height = image.height();
//遍历图像的每一个像素
for (int x = 0; x < width; ++x)
{
	for (int y = 0; y < height; ++y)
	{
		QString name = image.pixelColor(x, y).name();
		//将白色以外的颜色全部替换成红色,比如证件照,白底变红底,牛吧
		if (name = "#ffffff")
		{
		image.setPixelColor(x, y, Qt::red);
		}
	}
}
//保存文件
image.save("2.png");

QImage 很有很多强大的功能,在“qimage.h”中,很多的接口,多看看,多试试。
5.巧用Qt的全局对象
Qt内置了很多全局的对象参数可以直接获取,这样在使用的时候方便的不要不要的,比如判断当前鼠标左键还是右键可以直接用qApp->mouseButtons(),全局的鼠标坐标可以用QCursor::pos(),还有我们常见的颜色色值等。

//在鼠标右键的地方弹出菜单,如果菜单是QMenu而不是QAction则只能通过下面的方式弹出
if (qApp->mouseButtons() == Qt::RightButton) 
{
	videoMenu->exec(QCursor::pos());
}
//全局剪切板
qApp->clipboard();
//顶层控件对象集合
qApp->topLevelWidgets()
//当前焦点所在控件
qApp->focusWidget()
//当前平台名称
qApp->platformName()
//调用系统蜂鸣器
qApp->beep()
//打印当前Qt版本信息
qApp->aboutQt()
//设置全局的鼠标样式
qApp->setOverrideCursor()
//不使用系统的标准颜色字体等
QGuiApplication::setDesktopSettingsAware(bool on);
QApplication app(argc, argv);
//更多的全局对象属性等可以查阅 qguiapplication.h 头文件,你会发现新大陆

更多的全局对象属性等可以查阅 qguiapplication.h 头文件,说不定有你要的惊喜。
在这里插入图片描述
6.信号槽断连
有时候需要暂时停止某个控件发射信号(比如下拉框combobox添加数据的时候会触发当前元素改变信号),或者停止信号槽之间的连接关系,有多种处理,推荐用 blockSignals 方法

//方法1:先 disconnect 掉信号,处理好以后再 connect 信号,缺点很明显,很傻,如果信号很多,每个型号都要这么来一次。
disconnect(ui->cbox, SIGNAL(currentIndexChanged(int)), this, SLOT(on_cbox_currentIndexChanged(int)));
for (int i = 0; i <= 100; i++) 
{
ui->cbox->addItem(QString::number(i));
}
connect(ui->cbox, SIGNAL(currentIndexChanged(int)), this, SLOT(on_cbox_currentIndexChanged(int)));
//方法2:先调用 blockSignals(true) 阻塞信号,处理号以后再调用 blockSignals(false)恢复所有信号。
//如果需要指定某个信号进行断开那就只能用 disconnect 来处理。
ui->cbox->blockSignals(true);
for (int i = 0; i <= 100; i++) 
{
ui->cbox->addItem(QString::number(i));
}
ui->cbox->blockSignals(false);

7.低量数据就用sqlite
Qt在数据库相关的应用中,如果仅仅是单机版本,没有特别的需要,建议就使用sqlite数据库,尤其是一些单机版的,嵌入式的,千万级别以内的数据量,只要客户不指定,就用sqlite。Qt内置了sqlite数据库,只需要发布的时候带上插件就行,其他数据库要么还要带上动态库,要么还需要创建数据源;毕竟是内置的,在速度上,绝对无与伦比的出类拔萃;几千万的数据量完全没问题,而且速度和性能都还可以,所以数据量建议千万级别以下,着重注意数据库表和索引的设计;sqlite数据库也有几个重大缺点:不支持加密,不支持网络访问,不支持部分数据库高级特性,不支持海量数据(亿级别以上),但是对于绝大部分Qt项目还是足够;记住:Qt中数据库支持友好度大致是 sqlite > postgresql > mysql > odbc。

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

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

相关文章

衡石分析平台系统管理手册-功能配置之AI 助手集成嵌入指南

AI 助手集成嵌入指南​ 本文档将引导您通过几个简单的步骤&#xff0c;将 AI 助手集成或嵌入到您的系统中。HENGSHI SENSE AI 助手提供了多种集成方式&#xff0c;您可以通过 iframe、JS SDK 或 API 调用等方式将 AI 助手嵌入集成到您的系统中。 1. 通过 iframe 集成​ ifra…

老板最想要的20套模板!基于 VUE 国产开源 IoT 物联网 Web 可视化大屏设计器

如有需求&#xff0c;文末联系小编 Cola-Designer 是一个基于VUE开发&#xff0c;实现拖拽和配置方式生成数据大屏&#xff0c;提供丰富的可视化模板&#xff0c;满足客户业务监控、数据统计、风险预警、地理信息分析等多种业务的展示需求。Cola-Designer 帮助工程师通过图形化…

MySQL - 单表增删改

1. MySQL 概述 MySQL 是一种流行的开源关系型数据库管理系统 (DBMS)&#xff0c;广泛应用于互联网公司和企业开发中。它支持 SQL 语句操作数据&#xff0c;并提供多种版本供选择。 1.1 MySQL 安装和连接 社区版&#xff1a;免费版本&#xff0c;适合开发者使用。商业版&…

sizeof 和 strlen

一 . sizeof 关键字 这个是我们的老朋友了昂&#xff0c;经常都在使用&#xff0c;它是专门用来计算变量所占内存空间大小的&#xff0c;单位是字节&#xff0c;当然&#xff0c;如果我们的操作对象是类型的话&#xff0c;计算的就是类型所创建的变量所占内存的大小&#xff0…

【笔记】神领物流day1.1.13前后端部署【未完】

使用jenkins 前端部署 需要将前端开发的vue进行编译&#xff0c;发布成html&#xff0c;然后通过nginx进行访问&#xff0c;这个过程已经在Jenkins中配置&#xff0c;执行点击发布即可 网址栏输入神领TMS管理系统 (sl-express.com)即可看见启动成功 后端部署看linux 回到Jenki…

25维谛技术面试最常见问题面试经验分享总结(包含一二三面题目+答案)

开头附上工作招聘面试必备问题噢~~包括综合面试题、无领导小组面试题资源文件免费&#xff01;全文干货。 【免费】25维谛技术面试最常见问题面试经验分享总结&#xff08;包含一二三面题目答案&#xff09;资源-CSDN文库https://download.csdn.net/download/m0_72216164/8979…

单调递增/递减栈

单调栈 单调栈分为单调递增栈和单调递减栈 单调递增栈&#xff1a;栈中元素从栈底到栈顶是递增的 单调递减栈&#xff1a;栈中元素从栈底到栈顶是递减的 应用&#xff1a;求解下一个大于x元素或者是小于x的元素的位置 给一个数组&#xff0c;返回一个大小相同的数组&#x…

一文了解:最新版本 Llama 3.2

Meta AI最近发布了 Llama 3.2。这是他们第一次推出可以同时处理文字和图片的多模态模型。这个版本主要关注两个方面&#xff1a; 视觉功能&#xff1a;他们现在有了能处理图片的模型&#xff0c;参数量从11亿到90亿不等。 轻量级模型&#xff1a;这些模型参数量在1亿到3亿之间…

llamafactory0.9.0微调qwen2vl

LLaMA-Factory/data/README_zh.md at main hiyouga/LLaMA-Factory GitHubEfficiently Fine-Tune 100+ LLMs in WebUI (ACL 2024) - LLaMA-Factory/data/README_zh.md at main hiyouga/LLaMA-Factoryhttps://github.com/hiyouga/LLaMA-Factory/blob/main

【Java SE】初遇Java,数据类型,运算符

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 1. Java 概述 1.1 Java 是什么 Java 是一种高级计算机语言&#xff0c;是一种可以编写跨平台应用软件&#xff0c;完全面向对象的程序设计语言。Java 语言简单易学…

Android平台如何获取CPU占用率和电池电量信息

技术背景 我们在做Android平台GB28181设备接入模块、轻量级RTSP服务模块和RTMP推流模块的时候&#xff0c;遇到这样的技术诉求&#xff0c;开发者希望把实时CPU占用、电池信息等叠加在视频界面。 获取CPU占用率 Android平台获取CPU占用情况&#xff0c;可以读取/proc/stat文…

第十三届蓝桥杯真题Java c组D.求和(持续更新)

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;蓝桥杯关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 【问题描述】 给定 n 个整数 a1, a2, , an &#xff0c;求它们两两相乘再相…

生信初学者教程(十六):GO富集分析

文章目录 介绍加载R包导入数据所需函数运行输出结果总结介绍 GO(Gene Ontology)是一个在生物信息学中广泛使用的概念,用于描述基因和基因产物的功能、它们所处的细胞位置以及它们参与的生物过程。GO项目是一个协作性的国际努力,旨在建立和维护一个适用于各种物种的、结构化…

用Python实现运筹学——Day 6: 单纯形法求解过程

一、学习内容 1. 单纯形法的详细步骤 单纯形法是通过迭代过程来优化线性规划问题的解决方案。该算法从可行解空间的一个顶点出发&#xff0c;逐步沿着可行解空间的边界移动到另一个顶点&#xff0c;直到找到最优解。单纯形法的求解过程分为以下几个步骤&#xff1a; 初始化&a…

EE trade:黄金T+D是什么意思

黄金TD&#xff0c;全称“黄金延期交割”&#xff0c;是由上海黄金交易所推出的标准化合约&#xff0c;允许投资者以保证金的形式进行黄金交易&#xff0c;并可以选择当日交割或延期交割。它为国内投资者提供了一个全新的黄金投资渠道&#xff0c;但也存在一些风险&#xff0c;…

Linux进程切换以及调度算法

目录 Linux进程切换以及调度算法 Linux进程切换介绍 前置知识 进程切换过程分析 调度算法 补充知识 Linux进程切换以及调度算法 Linux进程切换介绍 前面提到&#xff0c;分时操作系统下&#xff0c;CPU会在多个进程中做高速切换以实现多个进程看似同时执行的&#xff0…

会员办理--足浴店系统开发代码———未来之窗行业应用跨平台架构

function fun_会员查询_事务_新增(){var 未来之窗vos对话框_内容 ;var title"test";var 未来之窗vos对话框_id"hjksgfjkkhkj";CyberWin_Dialog.layer(未来之窗vos对话框_内容,{type:"frame",title:"新增会员",move:false,width:"…

828华为云征文|WordPress部署

目录 前言 一、环境准备 二、远程连接 三、WordPress简介 四、WordPress安装 1. 基础环境安装 ​编辑 2. WordPress下载与解压 3. 创建站点 4. 数据库配置 总结 前言 WordPress 是一个非常流行的开源内容管理系统&#xff08;Content Management System, CMS&#xf…

FTP 服务器 linux安装

文章目录 前言一、了解二、安装启动匿名连接 三、创建用户1. 创建系统用户2. 连接3. 连接不上&#xff1f; 5004. 还是连接不上&#xff1f; 5005. 还还还是连不上&#xff1f;530 补充关于创建用户useradd 命令如何设置用户不能登录shell不用系统指定的家目录 vsftpd 配置chro…

Python | Leetcode Python题解之第443题压缩字符串

题目&#xff1a; 题解&#xff1a; class Solution:def compress(self, chars: List[str]) -> int:def reverse(left: int, right: int) -> None:while left < right:chars[left], chars[right] chars[right], chars[left]left 1right - 1n len(chars)write lef…