Qt高分辨率缩放

1.大致思路

在自己的电脑打包的软件在不同分辨率下会有问题无法正常使用,使用Qt自己的高分辨率缩放整体是可以实现的,但是会有一些地方很奇怪不太好用,所以自己实现一下。思路就是通过获取屏幕的分辨率自己计算出一个缩放因子,然后手动适配一下,将每个控件的大小坐标都乘上这个缩放因子就可以实现了。

2.实现功能

字体的大小会随着系统的缩放变大变小,所以也需要计算一下字体的缩放因子来调节

#ifdef Q_OS_WIN
    #include <windows.h>
    #include <WinUser.h>
    #include <wingdi.h>
    #include <dbghelp.h>
#endif
qreal adjScale;//针对ui缩放因子
qreal adjFontScale;//针对字体的缩放因子

在main函数中加入,这里以1920*1080为例

    HDC desktopDc = GetDC(NULL);
    float xPix = GetDeviceCaps(desktopDc, DESKTOPHORZRES);
    float yPix = GetDeviceCaps(desktopDc, DESKTOPVERTRES);
    float xDotsInch = GetDeviceCaps(desktopDc, LOGPIXELSX);
    adjScale = 1.0;
    qreal cx = GetSystemMetrics(SM_CXSCREEN);
    qreal cy = GetSystemMetrics(SM_CYSCREEN);
    // 计算windows的scale(100%,125%,200%,...)
    float winScale = xPix / cx;
    // 如果是宽屏,则修改cx为16/9比例的大小
    if (cx*9 > cy*16) {
        cx = cy * 16 / 9;
        xPix = yPix * 16 / 9;
    }
    // 计算缩放比例
    adjScale = xPix / 1920;
    adjFontScale = adjScale / winScale;

然后在ui里面调用一下这个方法,如果有很多子页面,可以先全部创建完再调用,就可以不用重复写很多次了

    QList<QObject*> objectList = findChildren<QObject*>();
    for(auto object:objectList)
    {
        if(QWidget *widget = qobject_cast<QWidget*>(object))
        {
            int x = widget->x();
            int y = widget->y();
            int width = widget->width();
            int height = widget->height();

            widget->setGeometry(x*adjScale,y*adjScale,width*adjScale,height*adjScale);

            //如果有用到QSpinBox类型,需要加上,否则字体大小会无法改变
            if(widget->objectName()=="qt_spinbox_lineedit") continue;

            QFont font = widget->font();
            int pointSize = font.pointSize();
            int pixSize = font.pixelSize();
            if (pixSize > 0) {
                font.setPixelSize(ceil(pixSize*adjScale));
            }
            if (pointSize > 0) {
                font.setPointSize(ceil(pointSize*adjFontScale));
            }
            widget->setFont(font);                     
        }
    }

3.注意的点

  • 如果有用到QSpinBox类型,不能对qt_spinbox_lineedit设置字体大小,否则字体大小会无法改变
  • 字体大小如果设置的是pointSize 需要乘上adjFontScale的因子,如果是pixSize,则需要乘上adjScale因子
  • 如果控件设置了固定大小,setGeometry将不起效果,必须额外设置一下
  • 如果设置了最大值或者最小值,也必须额外设置一下
ui->signal_bt->setFixedSize(15*adjScale,15*adjScale);
ui->Line->setMinimumWidth(ui->Line->minimumWidth()*adjScale);
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyQt是一种功能强大的Python图形用户界面(GUI)开发工具包,可以用来创建各种桌面应用程序。在不同分辨率的显示器上进行字体大小缩放是PyQt中的一个常见需求。 在PyQt中,可以使用QFont类来设置字体的大小。要根据显示器的高分辨率进行字体大小缩放,可以先通过QApplication类的`desktop()`方法获取当前系统的桌面设置,然后使用`screenGeometry()`方法获取当前显示器的分辨率信息。 接下来,可以通过自定义的缩放函数来计算字体的合适大小。这个函数可以根据显示器的分辨率和期望的缩放比例来调整字体的大小。在计算好合适的字体大小后,可以将其设置为应用程序中各个组件所使用的字体大小。 例如,假设要将字体大小按照显示器的高分辨率缩放为原来的1.5倍,可以使用以下代码实现: ```python import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QWidget from PyQt5.QtGui import QFont from PyQt5.QtCore import Qt class MyWindow(QMainWindow): def __init__(self): super().__init__() # 获取当前显示器的分辨率信息 screen = QApplication.desktop().screenGeometry() # 计算合适的字体大小 font_size = int(15 * screen.height() / 1080) # 为应用程序设置全局字体 font = QFont("Arial", font_size) QApplication.instance().setFont(font) self.initUI() def initUI(self): lbl = QLabel("PyQt字体大小缩放示例", self) lbl.setAlignment(Qt.AlignCenter) layout = QVBoxLayout() layout.addWidget(lbl) widget = QWidget(self) widget.setLayout(layout) self.setCentralWidget(widget) if __name__ == '__main__': app = QApplication(sys.argv) window = MyWindow() window.show() sys.exit(app.exec_()) ``` 在这个例子中,我们通过计算将字体大小缩放为当前显示器高度的1/72,从而使得在不同分辨率的显示器上都能显示相对一致的字体大小。 总之,通过使用PyQt提供的字体设置功能,结合显示器分辨率信息,我们可以实现在不同分辨率的显示器上进行字体大小缩放功能,从而提升应用程序的可视性和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值