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

打印 上一主题 下一主题

主题 1018|帖子 1018|积分 3054

前言

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

正文

本文通过Qt相干接口实时监测系统分辨率和缩放比的变化,并通过发送信号关照UI进行处置惩罚。兼容多屏环境,会自动检测软件窗口所在的屏幕。
关键代码:
  1. // HighDpiHelper.h
  2. #ifndef HIGHDPIHELPER_H
  3. #define HIGHDPIHELPER_H
  4. #include "qfont.h"
  5. #include "qscreen.h"
  6. #include <QObject>
  7. #include <QWindow>
  8. #include <QGuiApplication>
  9. #include <QDebug>
  10. /**
  11. * @brief The HighDpiHelper class
  12. * @author luoyayun361
  13. * 自动监测程序所在的屏幕 缩放比变化
  14. * 使用需要先调用 dpiHelper.setWindow(mainWindow),mainWindow是主窗口id
  15. */
  16. class HighDpiHelper : public QObject
  17. {
  18.     Q_OBJECT
  19. public:
  20.     HighDpiHelper() {
  21.         //适配多屏幕的情况,只监测程序窗口所在的屏幕
  22.         for(auto &screen : qApp->screens()){
  23.             connect(screen,&QScreen::logicalDotsPerInchChanged,this,[=](qreal dpi){
  24.                 if(!m_win){
  25.                     return;
  26.                 }
  27.                 auto sc = QGuiApplication::screenAt(QPoint(m_win->x(),m_win->y()));
  28.                 auto send = qobject_cast<QScreen*>(sender());
  29.                 if(sc == nullptr && send == nullptr){
  30.                     return;
  31.                 }
  32.                 if(sc->geometry() == send->geometry()){
  33.                     qDebug() <<__FUNCTION__<< "logicalDotsPerInchChanged="<<dpi/96.;
  34.                     emit dpiChanged(dpi/96.0f);
  35.                 }
  36.             });
  37.         }
  38.         for(auto &screen : qApp->screens()){
  39.             connect(screen,&QScreen::geometryChanged,this,[=](const QRect &geometry){
  40.                 if(!m_win){
  41.                     return;
  42.                 }
  43.                 auto sc = QGuiApplication::screenAt(QPoint(m_win->x(),m_win->y()));
  44.                 auto send = qobject_cast<QScreen*>(sender());
  45.                 if(sc == nullptr && send == nullptr){
  46.                     return;
  47.                 }
  48.                 if(sc->geometry() == send->geometry()){
  49.                     emit screenGeometryChanged(geometry);
  50.                 }
  51.             });
  52.         }
  53.     }
  54.     Q_INVOKABLE void setWindow(QWindow *win){
  55.         m_win = win;
  56.     }
  57.     //获取当前屏幕缩放比
  58.     Q_INVOKABLE float getScreenScalingFactor() {
  59.         auto sc = QGuiApplication::screenAt(QPoint(m_win->x(),m_win->y()));
  60.         if(sc){
  61.             return sc->logicalDotsPerInch() / 96.0f; // 96 dpi 是 Windows 的标准DPI,所有的缩放比都是相对于标准 DPI 的
  62.         }
  63.         else{
  64.             return 1.0;
  65.         }
  66.     }
  67.     //获取窗口所在的屏幕尺寸
  68.     Q_INVOKABLE QSize getScreenAvailableSize() {
  69.         auto sc = QGuiApplication::screenAt(QPoint(m_win->x(),m_win->y()));
  70.         if(sc){
  71.             return sc->availableSize();
  72.         }
  73.         else{
  74.             return qApp->screens().first()->availableSize();
  75.         }
  76.     }
  77. signals:
  78.     void dpiChanged(float scaleFactor);
  79.     void screenGeometryChanged(const QRect &geometry);
  80. private:
  81.     QWindow *m_win = nullptr;
  82. };
  83. #endif // HIGHDPIHELPER_H
复制代码
假如是在QWidget项目中,可以将QWindow 改成QWidget,然后将主窗口指针传进来即可。QML项目的话 直接利用QWindow就行。附件提供了两种场景下的demo调用。
本文demo下载

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

自由的羽毛

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表