Qt|开发程序如何自适应屏幕的简单方法

前提

在早几年前,PC的显示屏幕几乎是1920*1080、1680*1050这两种规格,对于PC的window界面开发人员来说,页面也都是按照屏幕大小进行设计的。但是这种根据屏幕大小进行界面设计的方式已经受到了很大限制!

近年来,显示屏的尺寸越来越多样化,PC开发的程序肯定不能再和之前一样了,那么该如何让PC开发的程序进行自适应屏幕呢?

功能实现

1:使用Qt自带的弹框功能。

优点:可以根据页面自动等比例拉伸控件。

缺点:对于new出来的控件,新手很不容易掌握,new出来的弹框不容易控制。

2:对现有的控件根据屏幕进行区域缩放。

这种方式是最快捷修改程序的。只需要计算出程序与屏幕的缩放系统,对每个控件的位置进行等比缩放,就能实现。很好的兼容以往程序。

今天主要是讲解如何使用第二种方式。

2.1:获取显示屏幕的大小

在main.cpp中获取当前显示屏的大小以及连接了几块显示屏幕

RECT SceenRect[2]{ (0,0,0,0), (0,0,0,0) };BOOL CALLBACK Monitorenumproc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
{static BOOL first = FALSE;   //重复检测标志//保存显示器信息MONITORINFO monitorinfo;monitorinfo.cbSize = sizeof(MONITORINFO);//获得显示器信息,将信息保存到monitorinfo中GetMonitorInfo(hMonitor, &monitorinfo);//若检测到主屏if (monitorinfo.dwFlags == MONITORINFOF_PRIMARY){if (!first)  //第一次检测到主屏{first = TRUE;SceenRect[0] = monitorinfo.rcWork;//将显示器的分辨率信息保存到rectreturn TRUE;}else //第二次检测到主屏,说明所有的监视器都已经检测了一遍,故可以停止检测了{first = FALSE;    //标志复位return FALSE;    //结束检测}}else{SceenRect[1] = monitorinfo.rcMonitor;//第二块屏幕信息}return TRUE;
}int main(int argc, char *argv[])
{QApplication::setAttribute(Qt::AA_UseOpenGLES);QApplication a(argc, argv);EnumDisplayMonitors(NULL, NULL, Monitorenumproc, 0);//获取所有屏幕的信息//实际实现代码...
}

2.2:计算缩放比

默认按照屏幕大小是:1920*1080进行缩放

float fScareFactor = rectScreen.width()/1920.0;

2.3:缩放控件以及窗口

设置计算缩放区域的函数

QRect ScaleGeometry(int x, int y, int w, int h)
{//计算,缩放区域int nLeft = std::round(x * fScareFactor);int nTop = std::round(y * fScareFactor);int nWidth = std::round(w * fScareFactor);int nHeight = std::round(h * fScareFactor);QRect rect(nLeft, nTop, nWidth, nHeight);return rect;
}

控件区域设置:

ui.btnTest->setGeometry(ScaleGeometry(10, 10, 100, 60));

在这里需要注意:

一定要使用std::round()方法进行四舍五入。

使用这种方式修改程序快捷,无需再添任何控件设置。对于老项目也能快速修改。

我是糯诺诺米团,一名C++开发程序媛~

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

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

相关文章

华为云幻兽帕鲁服务器搭建教程

华为云作为国内领先的云服务提供商,提供了丰富的云服务产品和解决方案,本文将介绍基于华为云服务器搭建幻兽帕鲁服务器,助力大家快速部署属于自己的游戏联机服务器! 第一步:购买服务器 华为云推出了游戏联机服务专用便…

Elasticsearch Windows版安装配置

Elasticsearch简介 Elasticsearch是一个开源的搜索文献的引擎,大概含义就是你通过Rest请求告诉它关键字,他给你返回对应的内容,就这么简单。 Elasticsearch封装了Lucene,Lucene是apache软件基金会一个开放源代码的全文检索引擎工…

Spark入门01-Spark简介

1 Spark是什么 Spark是用于大规模数据处理的统一分析引擎。对任意类型的数据进行自定义计算。 可以计算:结构化、非结构化,半结构化的数据结构,支持使用Python,Java,Scala、Sql语言开发应用程序计算数据。 计算框架&a…

一文掌握SpringBoot注解之@Configuration知识文集(1)

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

STM32G4 系列命名规则

STM32G4产品线 基础型系列STM32G4x1 具有入门级模拟外设配置,单存储区Flash,支持的Flash存储器容量范围从32到512KB。 增强型系列STM32G4x3 与基本型器件相比具有更多数量的模拟外设,以及双存储区Flash,Flash存储器容量也提高…

Docker 入门第一篇 安装Docker Desktop并结合Springboot在Idea中应用

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 往期专栏回顾 专栏描述…

虚拟机 网络模式

VMnet8默认不能访问VMnet1,但在实验中网络模式为NAT模式的虚拟机可以ping通网络模式为仅主机vmnet1的虚拟机,仅主机vmnet1的虚拟机 不可以ping通 网络模式为NAT模式的虚拟机 如果在虚拟机中没有进行任何额外的配置,但是 VMnet8(N…

Java技术栈 —— Servlet和Tomcat

一、Servlet 先理解Servlet。 Servlet 是一种在 Java 编程语言中用于创建动态 Web 应用程序的技术。 它是 Java Servlet API 的一部分,运行在 Web 服务器上,用于处理客户端(通常是浏览器)发送的 HTTP 请求。 Servlet 可以理解为是…

ISCTF wp

web 圣杯战争 题目源码 <?php highlight_file(__FILE__); error_reporting(0);class artifact{public $excalibuer;public $arrow;public function __toString(){echo "为Saber选择了对的武器!<br>";return $this->excalibuer->arrow;} }class pre…

web项目部署,一篇就搞定!

web部署的方式有很多&#xff0c;根据开发方式不同&#xff0c;部署方式也不同。最通用是docker部署&#xff0c;这个想必大家都熟悉。我们今天说另外一种。 部署过程 1、验证Jdk是否安装成功 2、验证Tomcat是否安装成功 3、验证Navicat 是否能连上数据库 4、创建数据库并导入…

JVM篇----第十八篇

系列文章目录 文章目录 系列文章目录前言一、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?二、对象分配规则三、描述一下JVM加载class文件的原理机制?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到…

【网络安全】2024年暗网威胁分析及发展预测

暗网因其非法活动而臭名昭著&#xff0c;现已发展成为一个用于各种非法目的的地下网络市场。 它是网络犯罪分子的中心&#xff0c;为被盗数据交易、黑客服务和邪恶活动合作提供了机会。为了帮助企业组织更好地了解暗网发展形势&#xff0c;近日&#xff0c;卡巴斯基的安全研究…

FCIS 2023:洞悉网络安全新前沿,引领未来安全创新狂潮

在数字化浪潮席卷全球的今天&#xff0c;网络安全问题愈发凸显其重要性。 FCIS 2023网络安全创新大会作为业界瞩目的盛会&#xff0c;不仅汇聚了国际顶尖的网络安全专家&#xff0c;更展示了最前沿的安全技术与研究成果。那么&#xff0c;参与这场大会&#xff0c;我们究竟能学…

2023年度统计DDoS攻击峰值暴增,如何选择合适的防护方式将为2024年的重点(DexunCloud)

进入 2024 年&#xff0c;发布了最新的 2023 年第三、四季度&#xff08;Q3-Q4&#xff09; DDoS 攻击趋势报告&#xff0c;指出 DDoS 攻击的规模和复杂性都有了惊人增长。 DexunCloud发现过去三年&#xff0c;DDoS 峰值攻击流量每年的增幅都超过了 100%&#xff0c;2021 年 D…

Sui主网升级至V1.17.3版本

Sui主网现已升级至V1.17.3版本&#xff0c;同时Sui协议升级至35版本。 其他升级要点如下所示&#xff1a; #15790 增加了一个选项&#xff0c;用于在开发审查时返回原始交易数据。 #15690 引入了对传统数据库快照时无需许可下载的支持。一个示例用法是sui-tool download-d…

从零开始学Linux之gcc命令

首先我们需要知道有两种编程语言 编译型语言&#xff1a;要求必须提前将所有源代码一次性转换成二进制指令&#xff0c;也就是生成一个可执行程序&#xff0c;例如C、C、go语言、汇编语言等&#xff0c;使用的转换工具称为编译器。 解释型语言&#xff1a;一边执行一边转换&a…

【2024全网最详细】Google 搜索命令终极指南

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 你是否尝试过使用 Google 搜索作为免费的 SEO …

结构体的学习

结构体与共用体&#xff0c;枚举 1.数据类型复习&#xff1a; 2结构体. eg&#xff1b;统计全校同学信息 需要记录的点--- 姓名&#xff0c;班级&#xff0c;性别&#xff0c;成绩&#xff0c;年龄 统计名字&#xff1a;char s[ ] [ 100 ] { "Tmo" } …

12.如何将图像转化为矩阵形式

read_image (Image, printer_chip/printer_chip_01) *获取图片大小 get_image_size (Image, Width, Height) *获取区域里各点(每个点)的坐标 *Image 输入参数&#xff0c; *Rows 输出参数 数组&#xff0c; *Columns 输出参数&#xff0c;数组 get_region_points (Image, Rows…

轩辕编程(Java第十二讲):Java类的抽象性和最终类

抽象类 使用关键字abstract声明的类称为抽象类&#xff0c;使用abstract声明的成员方法称为抽象方法。抽象方法只有方法声明没有方法体,例如下面的func1就为抽象方法 public abstract class AbstractClassExample {protected int x;private int y;public abstract void func1()…