我已閱讀官方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