Qt实现多屏幕多分辨率自适应

这里仅大概描述一下实现思路。

运行条件

  • 两个屏幕,分辨率不同。
  • Qt软件

问题提出

前段时间写了一个软件,窗口内有自绘内容。
自绘内容里面用的长度单位都是像素。可想而知,在开发者的电脑屏幕上大小都是符合要求的。到这一步都没问题。
软件开发完成后发给客户,客户在他的电脑上运行,也没问题,毕竟分辨率差不多。
偶然一次使用配有高分辨率显示器电脑运行软件,在4k屏下,软件出现了以下问题:

  • 整体尺寸和某些自绘内容(线条形状)变得很小,原因是屏幕分辨率升高了,像素更密集,相同个数的像素长度看起来更短,这个比较好理解。
  • 除了某些自绘的内容外,比如文字,却没有变小。这是因为在绘制文本的时候,字体设置大小使用了setPointSize,使得文本绘制在任何显示器上都具有相同的大小。
  • 最终的显示结果是,文字看起来很大,图形变得很小。

解决方法

实现多屏幕分辨率自适应

这里分两种情况讨论。

  1. 只使用一块屏幕
    这种情况下,只需要做以下工作:
  • 绘制图形时,以毫米为单位绘制。
  • 获取屏幕分辨率,添加长度->像素转换函数,将每个长度都转换成像素长度再传递给绘制函数。
    这样就可以实现不同分辨率下自绘内容自适应。
  1. 使用多个分辨率不同屏幕
    这种情况下,涉及到窗口拖拽的问题。
    当软件窗口从一个窗口拖拽到另外一个窗口时,需要重新排版。
    需要做以下工作:
  • 设计窗口分辨率改变通知信号
    在Qt中没有找到相关的通知机制,我们可以在paint函数中检测窗口的当前屏幕是否改变,如果发生改变,则发出一个信号。下面是一段实现代码,用于判断主屏幕是否改变:
bool Global::checkIfScreenChanged()
{static int screen_number = -1;bool changed = false;QWidget *w = mainWindow();QDesktopWidget *dk = QApplication::desktop();int new_screen_number = dk->screenNumber(w);if (screen_number != new_screen_number){screen_number = new_screen_number;changed = true;// 发出通知emit sigScreenChanged(screen_number);}return changed;
}
  • 重新布局和绘制
    接收到窗口屏幕改变消息后,进行重新布局、绘制。

实现效果

达到了预期效果。

结语

Windows上的软件,比如office、WPS都对多分辨率多屏幕进行了处理,可以将上述任意软件打开后从一个窗口拖动到另外一个窗口,在跨越屏幕的瞬间,软件会进行重新布局。和我们使用本文方法实现的效果相同。


最近创建了一个公众号,定期写写文章,主要是Qt相关的。如果您觉得文章有用,可以关注一下。
在这里插入图片描述

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

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

相关文章

您需要来自pc的权限才能_微信电脑版还是鸡肋吗?微信PC版3.0内测体验

[PConline 应用]微信PC版3.0来了!这到底是个怎样的版本?先说结果吧,好消息是微信PC端新版很快就要上线了,坏消息是这一回采用是邀请内测制,注定了很多人只能等到正式上线后,才能见到新版本!目前…

【转】【MySQL】事务与锁(四):行锁到底锁住的是什么?记录?字段?索引?

首先我们有三张表t1,t2,t3,它们都是只有两个字段, int类型的id和varchar类型的name;区别是t1没有索引,t2有主键索引,t3有唯一索引。 再强调一次,在实验前必须提前关闭自动提交,set autocommitof…

【编译原理】理解BNF

BNF范式 下面来自百度百科: 巴科斯范式(BNF)所描述的语法是与上下文无关的。它具有语法简单,表示明确,便于语法分析和编译的特点。 源码解析使用的算法就是BNF或者其改进算法。 什么是上下文无关文法呢? …

gibmacos 网络加速_黑苹果教程续集,利用EFI在线安装MacOS

本内容来源于什么值得买APP,观点仅代表作者本人 |作者:qianseyue创作立场声明:本人非某领域/某品牌从业人员,有机会学到一些专业知识。然而每个人站在不同立场,内容就会有所偏重,客观与否还请大…

【转】1.1【MySQL】基本SQL语句大全

1.库操作 登录数据库(-h -u -p -P都不需要空格) mysql -h {ip} -u {username} -p{password} -P {port} # -h ip默认是 localhost # -p 指定密码时中间不要空格,比如 -p123456 # -P 端口默认是 3306 1.1 增 create database 库名1.2 删 dr…

【GUI开发】图像处理类软件的浏览功能实现模型

图像处理软件包括但不限于: 图片浏览器,2D地图浏览器、图片编辑器等软件。 为了处理大分辨率图片,一般采用GDAL加载图像,GDAL可以动态加载图像的一部分,可以建立图像金字塔,优化加载速度。 一般的图像处理…

自动事务_JDBC进阶(二)事务编程

一、事务简介事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。事务具有ACID特性:原子性(Atomicity) —— 原子性是指事务是一个不可分割的工作单位&#xff0c…

【转】事务和锁机制是什么关系? 开启事务就自动加锁了吗?

数据库锁 因为数据库要解决并发控制问题。在同一时刻,可能会有多个客户端对同一张表进行操作,比如有的在读取该行数据,其他的尝试去删除它。为了保证数据的一致性,数据库就要对这种并发操作进行控制,因此就有了锁的概…

【精华】详解Qt中的内存管理机制

前言 内存管理,是对软件中内存资源的分配与释放进行有效管理的方法和理论。 众所周知,内存管理是软件开发的一个重要的内容。软件规模越大,内存管理可能出现的问题越多。如果像C语言一样手动地管理内存,一会给开发人员带来巨大的…

a标签里面设置onclick_实现a标签中的各种点击(onclick)事件的方法

我们常用的在a标签中有点击事件:1. a href"javascript:js_method();"这是我们平台上常用的方法,但是这种方法在传递this等参数的时候很容易出问题,而且javascript:协议作为a的href属性的时候不仅会导致不必要的触发window.onbefore…

【转】2.1【MySQL】运行原理(一):查询sql的执行过程及MySQL架构分析

MySQL的发展历史和版本分支: 时间里程碑1996 年MySQL1.0 发布。它的历史可以追溯到 1979 年,作者 Monty 用 BASIC 设计的一个报表工具。1996 年 10 月3.11.1 发布。MySQL 没有 2.x 版本。2000 年ISAM 升级成 MyISAM 引擎。MySQL 开源。2003 年MySQL4.0 …

docker多个容器一起打包_如何链接多个Docker容器并封装结果?

在另一个容器中运行容器意味着在Docker容器中运行Docker引擎.这被称为Docker-in-Docker的dind,我强烈反对它.你可以在线搜索’dind’并发现为什么在大多数情况下这是一个坏主意,但由于它不是你问题的主要对象,我不会进一步扩展这个主题.在同一容器中运行node.js进程和neo4j进程…

【转】2.2【MySQL】运行原理(二):InnoDB 内存结构、磁盘结构及update sql执行过程分析

前一篇讲完了查询流程,我们是不是再讲讲更新流程、插入流程和删除流程?在数据库里面,我们说的update操作其实包括了更新、插入和删除。如果大家有看过MyBatis的源码,应该知道Executor里面也只有doQuery()和doUpdate()的方法&#…

单片机ch2o程序_基于单片机的室内甲醛浓度检测系统

基于单片机的室内甲醛浓度检测系统田秀荣【期刊名称】《山西电子技术》【年(卷),期】2014(000)003【摘要】Aseveryoneknows,theharmfulgasremainedbyhousedecorationandinferiorfurnitureismainlyformaldehydewhichhasgreat harm to human body health , many diseases is rele…

【转】MySQL中select * for update锁表的问题

MySQL中select * for update锁表的问题 由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例) ,否则MySQL将会执行Table Lock (将整个资料表单给锁住)。 举个例子: 假设有个表单produc…

apqp过程流程图范本_APQP项目资料清单excel格式(全套)

APQP项目开发全套资料明细表设施要求新增刀具验收报告 量具、试验装备 要求 量具试验装备清单 新增量具试验装备计划技术/生产 技术/质保 采购▲ ★ ▲ ▲2.162.17项目组 新设备、工装和 A-3新设备、工装、刀具和试验 试验装置评审 装置检查清单 财务/技术2.18 新产品成本预算 …

【转】2.3【MySQL】运行原理(三)InnoDB 逻辑存储结构

MySQL的存储结构分为5级:表空间、段、簇、页、行。 1.表空间 TableSpace 上篇【MySQL】从InnoDB的内存结构、磁盘结构到update sql执行过程分析 在磁盘结构部分就说过了,表空间可以看做是InnoDB 存储引擎逻辑结构的最高层,所有的数据都存放在…

layui templet格式化_layui数据表格日期如何格式化成2012-12-30这样的?

test学生评优评先系统学生信息管理学生信息查询学生信息添加注册登录查看编辑删除$(function () {layui.use("table", function () {var $table layui.table;//第一个实例$table.render({elem: #stu,height: 300,//数据接口,url: /stu/student/getAllClazz,//开启分…

【转】【MySQL】运行原理(四):重做日志(redo log),回滚日志(undo log),二进制日志(binlog)

MySQL中有六种日志文件,分别是:重做日志(redo log)、回滚日志(undo log)、二进制日志(binlog)、错误日志(errorlog)、慢查询日志(slow query log&…

python 读中文乱码_python字符乱码的解决小结

引言无论学习什么程序语言,字符串这种数据类型总是着有非常重要。然而最近在学习python这门语言,想要显示中文,总是出现各种乱码。于是在网上查了很多资料,各说纷纭,我也尝试了许多的方法,有时候可以正常显…