我已阅读官方Qt documentation以及StackOverflow上关于Qt中对高DPI支持的许多文章和问题。他们都专注于移植旧应用程序,并尽可能少地进行修改。如何开发新的Qt 5.7+高DPI每个监视器DPI感知应用程序?
但是,如果我要启动一个全新的应用程序,并且打算支持每台显示器支持DPI的应用程序,那么最佳方法是什么?
如果我理解正确,Qt::AA_EnableHighDpiScaling
是我想要的相反。我应该实际上禁用HighDpiScaling并在运行时手动计算所有尺寸?
许多建议表示不使用大小,而是使用浮动布局。但是在许多情况下,希望存在至少最小宽度和/或最小高度。由于Qt Designer只允许我以绝对像素来表示值,所以正确的方法是什么?如果显示器分辨率发生变化,我应该在哪里放置代码来重新计算尺寸?
或者我应该只是去自动缩放?
从以前的Qt应用程序我的解决方案(没有得到很好的测试)
在我的旧的应用程序,我试图添加HighDPI扶持的企业之一,我用这个方法 - 列表DOM的所有儿童,并调整它们的大小一一给出一些比例。 Ratio = 1会产生与我在Qt Designer中指定的尺寸相同的尺寸。
void resizeWidgets(MyApp & qw, qreal mratio)
{
// ratio to calculate correct sizing
qreal mratio_bak = mratio;
if(MyApp::m_ratio != 0)
mratio /= MyApp::m_ratio;
// this all was done so that if its called 2 times with ratio = 2, total is not 4 but still just 2 (ratio is absolute)
MyApp::m_ratio = mratio_bak;
QLayout * ql = qw.layout();
if (ql == NULL)
return;
QWidget * pw = ql->parentWidget();
if (pw == NULL)
return;
QList<QLayout *> layouts;
foreach(QWidget *w, pw->findChildren<QWidget*>())
{
QRect g = w->geometry();
w->setMinimumSize(w->minimumWidth() * mratio, w->minimumHeight() * mratio);
w->setMaximumSize(w->maximumWidth() * mratio, w->maximumHeight() * mratio);
w->resize(w->width() * mratio, w->height() * mratio);
w->move(QPoint(g.x() * mratio, g.y() * mratio));
}
foreach(QLayout *l, pw->findChildren<QLayout*>())
{
if(l != NULL && !(l->objectName().isEmpty()))
layouts.append(l);
}
foreach(QLayout *l, layouts) {
QMargins m = l->contentsMargins();
m.setBottom(m.bottom() * mratio);
m.setTop(m.top() * mratio);
m.setLeft(m.left() * mratio);
m.setRight(m.right() * mratio);
l->setContentsMargins(m);
l->setSpacing(l->spacing() * mratio);
if (l->inherits("QGridLayout")) {
QGridLayout* gl = ((QGridLayout*)l);
gl->setHorizontalSpacing(gl->horizontalSpacing() * mratio);
gl->setVerticalSpacing(gl->verticalSpacing() * mratio);
}
}
QMargins m = qw.contentsMargins();
m.setBottom(m.bottom() * mratio);
m.setTop(m.top() * mratio);
m.setLeft(m.left() * mratio);
m.setRight(m.right() * mratio);
// resize accordingly main window
qw.resize(qw.width() * mratio, qw.height() * mratio);
qw.setContentsMargins(m);
qw.adjustSize();
}
这是从主叫:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyApp w;
// gets DPI
qreal dpi = a.primaryScreen()->logicalDotsPerInch();
MyApp::resizeWidgets(w, dpi/MyApp::refDpi);
w.show();
return a.exec();
}
我不认为这是一个很好的解决方案。鉴于我开始新鲜,我可以完全自定义我的代码到最新的Qt标准,我应该采用什么方法来获得HighDPI应用程序?
在Win32上,我们发现成功简单地查询显示器dpi设置的操作系统(GetDeviceCaps),除以96.0,并设置env变量'QT_SCALE_FACTOR'以匹配。有权衡。在Mac上,我们不需要做任何事情。因人而异。 – selbie
@selbie,如何设置QT_SCALE_FACTOR地址每监视器缩放? – AlexanderVX
也许这个QT_SCREEN_SCALE_FACTORS [list]指定每个屏幕的比例因子。这不会更改磅值字体的大小。此环境变量主要用于调试,或者用错误的EDID信息(扩展显示标识数据)解决显示器问题。但不确定,任何人都在尝试从应用内设置它? – AlexanderVX