【QT5-解决不同分辨率屏幕-进行匹配大小-适应屏幕大小-基础样例】

【QT5-解决不同分辨率屏幕-进行匹配大小-适应屏幕大小】

1、前言

作为qt的初学者,开始入门qt的时候,很多东西其实也不是很会,调试好的软件如何发给别人使用,如何去做,也不是很清楚的,自己也查了很多资料才渐渐明白。

开始学习的时候,不同分辨率屏幕适配性的问题,一直没有较好的解决,记得当时找过一些方式,没能成功,如今再次查找,并且在大佬指点下,可以一定程度上适配了,或者说至少不会出现分配率很高,DIY软件很小,或者很大问题了。

另外软件看不看这些事情,多少有些主观上意思,说白了,人的喜好不同,布局出来的也不一样,有点就是喜好大一点图标,所以上我说一定程度上适配,要是完全解决,几乎不可能。

2、实验环境

实验环境还是挺重要的,因为有时候,在你电脑上能运行的东西,在别人的电脑就不一定能运行,这一部分的原因就可能是实验版本不一样。

系统环境:window环境

QT软件版本:qt 5.14.2

3-1、问题说明-屏幕视频

写相应文章,都是为了解决相应问题的,本次就是为了解决相关屏幕适配大小问题。

之前一直无法成功,其实当时对qt等都不是特别了解,只是知道,可以重新设置软件外框大小,不知道如何根据屏幕设置外壳,再加上不会布局,内部控件也不会随着外围框大小改变。

之后会布局后,会加入图片等,但是发现一改变屏幕分辨率,控件和整体就会不适应,所以困扰了许久。

如下图所示,我屏幕是4k屏幕,但是软件自动只是占据了一部分,并不是自己想要,自己虽然不希望铺满全屏,但是至少大一些,显示多一点。

3-2、解决方式-个人总结

**

解决思路:我们在软件启动的时候,先获取屏幕大小,然后根据长宽,按照一定比例,重新设置大小。并且先把软件布局布好,内部控件也要规定好大小,让其不会因为屏幕分辨率不同,而乱显示。

**

(1)基础布局

首先,要进行布局,布局不只是调整各个控件比例等,还是个人审美,真正好的布局(ui设计)是需要花不少时间,本博客只是为说明问题,简单弄了一下。

参考文章:【QT 整体窗口拖动大小,内部控件无法跟随改变的原因>>>>>解决:布局相关,布局设置】

(2)参考文章-QScreen类

这里参考以下文章,知道了有QScreen这个类,是专门获取屏幕相关信息。

参考博文:https://blog.csdn.net/WL0616/article/details/129182751

主要代码段如下:

cpp 复制代码
....
    QRect rect1 = screen->geometry();
    qDebug() << "rect1" << rect1.size().width() << rect1.size().height();
    qDebug() << rect1.topLeft();
    qDebug() << rect1.bottomRight();

    QRect rect2 = screen->availableGeometry();
    qDebug() << "rect2" << rect2.size().width() << rect2.size().height();
    qDebug() << rect2.topLeft();
    qDebug() << rect2.bottomRight();

    int screen_width= rect2.size().width()*0.75;  //设置可显示部分比例
    int screen_height= rect2.size().height()*0.75; //设置可显示部分比例
...

查看一下官方文档,有更详细介绍,大概意思就是说,会扫描物理屏幕可以使用的面积,然后win11上或许有些不同,更详细请自行去文档中查看吧。

文档链接:https://doc.qt.io/qt-5/qscreen.html#details

(3)大佬指点

另外就是一个大佬指点,所谓假传万卷书,真传一句话,简单总结就是,为每个控件规定大小,这在改变是,所占有像素就不会有太大变化,就不会出现适配性问题,更严苛一点,你可以设定固定一个值,包括内部字体和图标,图标主要是选择合适大小的。

4、本次实验

1、新建工程

往昔文章说的听多了,可以参考其他位置,作为初学者,请看以下文章吧,就不过多赘述了。

参考文章:【QT 整体窗口拖动大小,内部控件无法跟随改变的原因>>>>>解决:布局相关,布局设置】

2-1、控件布局

本次为了说明问题,简单拉了几个控件,进行设置布局,需要看细节的,直接去"代码链接"部分,看代码吧。

2-2、控件限定大小

设置一些大小,包括但不限于,字体,使用图标,外框等,说起来挺简单,但是实际微调还是需要反复实验的,并且有时候,你调试界面和最终软件运行还不一样,进行反复实验,才能得到自己满意的界面。

2-3、启动时,扫描一下屏幕大小

如下为main.cpp文件内容,再次文件内写入相关代码。

cpp 复制代码
#include "mainwindow.h"
#include <QDesktopWidget>
#include <QDebug>
#include <QScreen>
#include <QApplication>

int main(int argc, char *argv[])
{

    QApplication a(argc, argv);
    MainWindow w;

     QDesktopWidget* pDesktopWidget = QApplication::desktop();
    //获取可用桌面大小
    QRect deskRect = QApplication::desktop()->availableGeometry();
    qDebug()<<"deskRect:"<<deskRect.x()<<" "<<deskRect.y()<<endl;
    //获取主屏幕分辨率
    QRect screenRect = QApplication::desktop()->screenGeometry();
    qDebug()<<"screenRect:"<<screenRect.x()<<" "<<screenRect.y()<<endl;
    //获取屏幕数量
    int nScreenCount = QApplication::desktop()->screenCount();
    qDebug()<<"nScreenCount:"<<nScreenCount<<endl;

    QScreen* screen = QGuiApplication::primaryScreen();
	//获取当前实际屏幕大小
    QRect rect1 = screen->geometry();
    qDebug() << "rect1" << rect1.size().width() << rect1.size().height();
    qDebug() << rect1.topLeft();
    qDebug() << rect1.bottomRight();
	//获取当前实际可用屏幕大小(去掉下边框)
    QRect rect2 = screen->availableGeometry();
    qDebug() << "rect2" << rect2.size().width() << rect2.size().height();
    qDebug() << rect2.topLeft();
    qDebug() << rect2.bottomRight();

    int screen_width= rect2.size().width()*0.75;    //设置可显示部分比例
    int screen_height= rect2.size().height()*0.75;  //设置可显示部分比例


    w.resize(screen_width,screen_height);

    w.show();
    return a.exec();
}

3、验证

如下图所示,可以按照自己的比例,写设置大小,并且告诉你当前屏幕大小,和可以使用的大小。

5、实验代码-链接

代码链接:
https://download.csdn.net/download/qq_22146161/88352951

6、细节部分

(1)多屏幕问题

循环扫描+重设屏幕大小。

实际每个人的喜好不同,有人喜好用两个屏幕,或者更多屏幕的,软件在切换的时候,或者被鼠标拖着去另一个屏幕时候,这样情况,本文暂时不讨论,只是提供一个思路,一种方式,是检测的方式,通过检测屏幕大小,而更改软件大小。

(2)旧的类问题

博文中也提到了,有个类已经不用,软件会自动提示使用新的类。

7、总结

另外想说的是,我的文章,一般比较少的会讲某个原理性的东西,一般来说一搜,网上会有很多说的,但是一般网上很少有存在,具体解决方式的,大多数情况,其实我们都是明白一些道理的,只是不知道如何去实现,不知道如何去走那个路径,我尽量趟出一条路,告诉你如此做是可以的,这样是可以解决实际问题的。

相关推荐
半夏知半秋15 分钟前
lua debug相关方法详解
开发语言·学习·单元测试·lua
Andy01_19 分钟前
Java八股汇总【MySQL】
java·开发语言·mysql
坊钰38 分钟前
【Java 数据结构】合并两个有序链表
java·开发语言·数据结构·学习·链表
阿杰同学40 分钟前
如何实现 MySQL 的读写分离?
数据库·mysql
weisian1511 小时前
Redis篇--应用篇3--数据统计(排行榜,计数器)
数据库·redis·缓存
羊村懒哥1 小时前
mysql-二进制安装方式
数据库·mysql
言之。1 小时前
Redis单线程快的原因
数据库·redis·缓存
geovindu1 小时前
python: Oracle Stored Procedure query table
数据库·python·mysql·postgresql·oracle·sqlserver·mssql
扶尔魔ocy2 小时前
【QT开发自制小工具】PDF/图片转excel---调用百度OCR API接口
qt·pdf·ocr·excel
工业甲酰苯胺2 小时前
聊一聊 C#线程池 的线程动态注入
java·开发语言·c#