Qt适配Windows缩放 | 您所在的位置:网站首页 › win10程序界面显示不全 › Qt适配Windows缩放 |
问题:
我们都知道windows系统有缩放功能,能够按比例缩小或者放大控件和文字。 无论缩放比例是多少,控件大小和字体大小都不变。字体我们使用 setPixelSize(int pixelSize) 方法。 QFont font; font.setPixelSize(14); ui->pushButton->setFont(font); ui->pushButton_2->setFont(font); ui->label->setFont(font);效果: 125%: 有关windows的DPI缩放的可以先看下这里: https://docs.microsoft.com/en-us/previous-versions//dn953371(v=vs.85) 由以上我们可以知道qt默认的是字体可以进行自由缩放,因为默认的是设置pointSize。point size 规定了实际中我们肉眼看到的字体的大小 他和pixel无关的,他和显示器无关不管在什么样上的显示器上规定大小是多少就是多少。pixel size 是所占的像素大小,即便进行缩放,他的大小也并没有改变,所占像素也并没有改变。 我们首先了解一下DPI,DPI:Dot per inch,在显示器上也就是每英寸包含的像素。英尺的换算为 1 inch = 2.54 cm。windows上的逻辑DPI都是96。如果进行缩放的话那么相应的逻辑DPI会变为96*缩放系数。比如125%的话逻辑DPI就是120;我们无法直接获取125%,但是可以通过QScreen的 logicalDotsPerInch()方法来获取当前的逻辑DPI,再除以94来计算当前的缩放系数。 计算方法: int scaleUI(int spec) { double rate = 0; QList screens = QApplication::screens(); if (screens.size() > 0) { QScreen* screen = screens[0]; double dpi = screen->logicalDotsPerInch(); rate = dpi / 96.0; if (rate rate = 1.25; } else if (rate rate = 1.75; } else { rate = 2.0; } } return int(spec * rate); }使用方法: ui->pushButton->resize(scaleUI(93), scaleUI(28)); ui->pushButton_2->resize(scaleUI(186), scaleUI(56)); ui->label->resize(scaleUI(93), scaleUI((28)));100%: widget.cpp #include #include #include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); ui->pushButton->resize(scaleUI(93), scaleUI(28)); ui->pushButton_2->resize(scaleUI(186), scaleUI(56)); ui->label->resize(scaleUI(93), scaleUI((28))); QList screens = QApplication::screens(); if (screens.size() > 0) { QScreen* screen = screens[0]; connect(screen, &QScreen::logicalDotsPerInchChanged, this, &Widget::onLogicalDotsPerInchChanged); } } Widget::~Widget() { delete ui; } void Widget::onLogicalDotsPerInchChanged(qreal dpi) { m_scaleFromPreRate = (double)dpi / 96 / m_preRate; m_preRate = (double)dpi / 96; findChild(*this); } void Widget::findChild(const QObject &o) { for (int i=0; i qDebug() width()*m_scaleFromPreRate, pWidget->height()*m_scaleFromPreRate); findChild(*(o.children().at(i))); } } } int Widget::scaleUI(int spec) { double rate = 0; if (0 == (int)rate) { QList screens = QApplication::screens(); if (screens.size() > 0) { QScreen* screen = screens[0]; double dpi = screen->logicalDotsPerInch(); rate = dpi / 96.0; if (rate rate = 1.25; } else if (rate rate = 1.75; } else { rate = 2.0; } } } m_preRate = rate; return int(spec * rate); } |
CopyRight 2018-2019 实验室设备网 版权所有 |