通过根据Calculating Scaling Ratio(在 Qt 文档中)中描述的比率数学编写一些帮助代码,我取得了“足够好”的成功。
主要缺点是这需要您养成将任何原始文字大小数字包装在辅助函数中的习惯。
起点是如下代码,只需要在应用启动时执行一次:
#include <QGuiApplication>
#include <QScreen>
#include <QDebug>
...
auto screen = QGuiApplication::primaryScreen();
const QRect currScreen = screen->geometry();
const qreal dpi = screen->logicalDotsPerInch();
const double refDpi = 96;
const double refHeight = 2160;
const double refWidth = 3840;
// These computations are taken nearly verbatim from:
// https://doc.qt.io/qt-5/scalability.html#calculating-scaling-ratio
// (archival) http://web.archive.org/web/20210511233243/https://doc.qt.io/qt-5/scalability.html#calculating-scaling-ratio
m_extentsRatio = qMin( currScreen.height() / refHeight, currScreen.width() / refWidth );
m_fontsRatio = qMin( currScreen.height() * refDpi / ( dpi * refHeight ), currScreen.width() * refDpi / ( dpi * refWidth ) );
qDebug() << "m_extentsRatio" << m_extentsRatio;
qDebug() << "m_fontsRatio" << m_fontsRatio;
很明显,这些变量捕获有关您正在测试的主机(例如您的笔记本电脑)的信息:
auto screen = QGuiApplication::primaryScreen();
const QRect currScreen = screen->geometry();
const qreal dpi = screen->logicalDotsPerInch();
相比之下:
refDpi、refHeight 和 refWidth 代表您希望“模拟”的屏幕的 {DPI,height,width}(例如某些奇特的手机型号)。
如果您想让整个方法更容易“插入”,您可以将refDpi、refHeight 和refWidth 作为命令行参数传递给您的应用程序,以便您可以重新启动以进行模拟各种目标模型,无需重新编译。
解决方案的其余部分是:(1) 编写一个您的 QML 代码可以使用的 Q_INVOKABLE 辅助函数,以及 (2) 始终喜欢在该辅助函数中包装原始文字整数大小。
具体来说:
Q_INVOKABLE double asIfOnSomePhone( double input, bool isFontSize )
{
if( isFontSize )
{
return input * m_fontsRatio;
}
else
{
return input * m_extentsRatio;
}
}
在 QML 中:
Layout.minimumHeight: localScreen.asIfOnSomePhone(157,
false /*isFontSize*/)
Layout.maximumHeight: Layout.minimumHeight
Layout.minimumWidth: localScreen.asIfOnSomePhone(625,
false /*isFontSize*/)
Layout.maximumWidth: Layout.minimumWidth
...
property font basicFont
basicFont.bold: false
basicFont.underline: false
basicFont.pointSize: localScreen.asIfOnSomePhone(14, true /*isFontSize*/)
basicFont.family: "Bitstream Vera Sans"
这使我能够轻松地迭代 GUI 设计,该设计旨在最终在分辨率与我在日常工作中使用的显示器大不相同的显示器上运行。一旦我开始应用这种策略,我就能够以最小的意外将我的设计转移到最终平台上。
我养成的另一个习惯,可以缓解在 QML 中编写响应式 UI 时遇到的一些困难,那就是将许多测量值表示为总显示高度和/或宽度的比例。我使用名为 percentOfAppHeightCappedMinAndMax 和 percentOfAppWidthCappedMinAndMax 的辅助函数。您可以找到完整的working sample on GitHub。