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同时改变位置
相关代码如下
//刷新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);
来源:CSDN
作者:风玲一诺
链接:https://blog.csdn.net/weixin_42132304/article/details/104667560