Windows Qt动态监测系统分辨率及缩放比变化

前言

Windows 显示设置中,可以修改缩放比,所有界面和文字会同比例放大或缩小,在开发桌面程序时, 实时监测Qt应用程序在不同缩放比例下的表现,可以及时调整程序界面以适应不同显示屏幕的需求。

正文

本文通过Qt相关接口实时监测系统分辨率和缩放比的变化,并通过发送信号通知UI进行处理。兼容多屏情况,会自动检测软件窗口所在的屏幕。

关键代码:

cpp 复制代码
// HighDpiHelper.h
#ifndef HIGHDPIHELPER_H
#define HIGHDPIHELPER_H

#include "qfont.h"
#include "qscreen.h"
#include <QObject>
#include <QWindow>
#include <QGuiApplication>
#include <QDebug>

/**
 * @brief The HighDpiHelper class
 * @author luoyayun361
 * 自动监测程序所在的屏幕 缩放比变化
 * 使用需要先调用 dpiHelper.setWindow(mainWindow),mainWindow是主窗口id
 */

class HighDpiHelper : public QObject
{
    Q_OBJECT

public:
    HighDpiHelper() {
        //适配多屏幕的情况,只监测程序窗口所在的屏幕
        for(auto &screen : qApp->screens()){
            connect(screen,&QScreen::logicalDotsPerInchChanged,this,[=](qreal dpi){
                if(!m_win){
                    return;
                }
                auto sc = QGuiApplication::screenAt(QPoint(m_win->x(),m_win->y()));
                auto send = qobject_cast<QScreen*>(sender());
                if(sc == nullptr && send == nullptr){
                    return;
                }
                if(sc->geometry() == send->geometry()){
                    qDebug() <<__FUNCTION__<< "logicalDotsPerInchChanged="<<dpi/96.;
                    emit dpiChanged(dpi/96.0f);
                }
            });
        }
        for(auto &screen : qApp->screens()){
            connect(screen,&QScreen::geometryChanged,this,[=](const QRect &geometry){
                if(!m_win){
                    return;
                }
                auto sc = QGuiApplication::screenAt(QPoint(m_win->x(),m_win->y()));
                auto send = qobject_cast<QScreen*>(sender());
                if(sc == nullptr && send == nullptr){
                    return;
                }
                if(sc->geometry() == send->geometry()){
                    emit screenGeometryChanged(geometry);
                }
            });
        }
    }

    Q_INVOKABLE void setWindow(QWindow *win){
        m_win = win;
    }

    //获取当前屏幕缩放比
    Q_INVOKABLE float getScreenScalingFactor() {
        auto sc = QGuiApplication::screenAt(QPoint(m_win->x(),m_win->y()));
        if(sc){
            return sc->logicalDotsPerInch() / 96.0f; // 96 dpi 是 Windows 的标准DPI,所有的缩放比都是相对于标准 DPI 的
        }
        else{
            return 1.0;
        }
    }

    //获取窗口所在的屏幕尺寸
    Q_INVOKABLE QSize getScreenAvailableSize() {
        auto sc = QGuiApplication::screenAt(QPoint(m_win->x(),m_win->y()));
        if(sc){
            return sc->availableSize();
        }
        else{
            return qApp->screens().first()->availableSize();
        }
    }

signals:
    void dpiChanged(float scaleFactor);
    void screenGeometryChanged(const QRect &geometry);
private:
    QWindow *m_win = nullptr;
};
#endif // HIGHDPIHELPER_H

如果是在QWidget项目中,可以将QWindow 改成QWidget,然后将主窗口指针传进来即可。QML项目的话 直接使用QWindow就行。附件提供了两种场景下的demo调用。

本文demo下载

相关推荐
吳所畏惧4 小时前
NVM踩坑实录:配置了npm的阿里云cdn之后,下载nodejs老版本(如:12.18.4)时,报404异常,下载失败的问题解决
前端·windows·阿里云·npm·node.js·batch命令
leese2334 小时前
FreeMarker模板引擎
windows
love530love5 小时前
命令行创建 UV 环境及本地化实战演示—— 基于《Python 多版本与开发环境治理架构设计》的最佳实践
开发语言·人工智能·windows·python·conda·uv
呉師傅5 小时前
佳能iR-ADV C5560复印机如何扫描文件到电脑
运维·网络·windows·计算机外设·电脑
程序视点5 小时前
【最新专业评测】PDF Reducer专业版:85%超高压缩率的PDF压缩神器|Windows最佳PDF压缩工具推荐
windows
qyhua8 小时前
Windows 平台源码部署 Dify教程(不依赖 Docker)
人工智能·windows·python
女程序猿!!!10 小时前
网址收集总结
windows
love530love12 小时前
Windows 如何更改 ModelScope 的模型下载缓存位置?
运维·人工智能·windows·python·缓存·modelscope
weixin_3077791318 小时前
Windows 11下纯软件模拟虚拟机的设备模拟与虚拟化(仅终端和网络)
windows·系统架构
程序员黄老师1 天前
在 Windows 使用 Nginx/HAProxy 实现负载均衡
windows·nginx·负载均衡