【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、总结

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

相关推荐
Swift社区1 小时前
在 Swift 中实现字符串分割问题:以字典中的单词构造句子
开发语言·ios·swift
没头脑的ht1 小时前
Swift内存访问冲突
开发语言·ios·swift
没头脑的ht1 小时前
Swift闭包的本质
开发语言·ios·swift
wjs20241 小时前
Swift 数组
开发语言
Python私教1 小时前
model中能定义字段声明不存储到数据库吗
数据库·oracle
stm 学习ing2 小时前
FPGA 第十讲 避免latch的产生
c语言·开发语言·单片机·嵌入式硬件·fpga开发·fpga
湫ccc3 小时前
《Python基础》之字符串格式化输出
开发语言·python
mqiqe4 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
AttackingLin4 小时前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python