QT控件字体根据系统缩放比例(DPI)自适应

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-05 12:12:50

QT控件字体根据系统DPI自适应

现象

在学习使用QT编写串口助手时,发现生成软件在屏幕缩放比例不同(也就是dpi不同)的情况下显示的不一样,比如系统缩放比例设为150%情况下的显示
在这里插入图片描述

而一般情况下的缩放比例为100%的情况下的显示
在这里插入图片描述
对比发现,系统缩放比例改为150%后,软件的字体也随之放大,但控件大小没有变化。

分析

导致这种现象的原因是设计时字体是Point Size,会随着系统更改缩放比例而调整,而QT的控件不会因为系统缩放比例变化而变化。

解决方案

参考网上一些资料,有两种方案
1、字体使用Pixel Size,这种方案,字体和控件都不会因系统缩放比例改变而变化,缺点应该是在一些缩放比例设置为150%的电脑上软件会看起来比较小,比如我的小新air13。
参考 https://blog.csdn.net/Think88666/article/details/83591183
2、打开软件的时候获取系统dpi,根据dpi对所有控件进行缩放。
参考 https://blog.csdn.net/a844651990/article/details/83963669
在我看来第二种方案更加合适一些,根据上面链接加入一些代码,在缩放控件的同时,缩放其坐标位置。显示如下
缩放控件size但不改变位置
缩放控件size但不改变位置
缩放控件size同时改变位置
缩放控件size同时改变位置

相关代码如下

//刷新dpi
void MainWindow::refreshDPI()
{
    //计算dpi
    QList<QScreen*> screens = QApplication::screens();
    QScreen* screen = screens[0];
    qreal dpi = screen->logicalDotsPerInch();
    //计算dpi对应的缩放比例
    double objectRate = dpi/96.0;
    changeObjectSize(*this, objectRate);
    qDebug()<<"width "<<width() << "height "<< height();
    resize(width()*objectRate,height()*objectRate);
}
//修改所有控件尺寸
void MainWindow::changeObjectSize(const QObject &o, double objectRate)
{
    for (int i=0; i<o.children().size(); ++i) {
        QWidget *pWidget = qobject_cast<QWidget *>(o.children().at(i));
        if (pWidget != nullptr) {
            qDebug() << pWidget->width() << pWidget->height();
            //pWidget->resize(pWidget->width()*objectRate, pWidget->height()*objectRate);
            pWidget->setGeometry(pWidget->x()*objectRate,pWidget->y()*objectRate,
                                 pWidget->width()*objectRate, pWidget->height()*objectRate);
            changeObjectSize(*(o.children().at(i)),objectRate);
        }
    }
}
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    refreshDPI(); //根据dpi调整窗体大小
}

我这里只在软件打开时获取一次系统dpi并调整窗体,如果在运行过程中更改系统缩放比例,软件不会调整。想要实时调整的可以参考上面的链接,

connect(screen, &QScreen::logicalDotsPerInchChanged, this, &Widget::onLogicalDotsPerInchChanged);
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!