Qtの高DPIサポートについては、Qt documentationの公式と多くの記事や質問をStackOverflowで読んでいます。それらのすべては、古いアプリケーションを移植し、できるだけ変更を少なくして動作させることに重点を置いています。新しいQt 5.7+ High-DPI Per Monitor DPI対応アプリケーションの開発にアプローチする方法は?
しかし、新しいアプリケーションを開始する場合は、モニタごとのDPI対応アプリケーションをサポートするという意図で、最良のアプローチは何ですか?
私が正しく理解していれば、Qt::AA_EnableHighDpiScaling
は私が欲しいものの正反対です。私は実際にHighDpiScalingを無効にし、実行時にすべての寸法を手動で計算する必要がありますか?
多くの提案は、フローティングレイアウトを使用するためにサイズをまったく使用しないと言っています。しかし、多くの場合、少なくとも最小幅および/または最小高さが存在することが望ましい。 Qt Designerでは、絶対ピクセルで値を入力することしかできませんが、正しいアプローチは何ですか?モニター解像度が変更された場合、ディメンションを再計算するためのコードはどこに置く必要がありますか?
また、自動スケーリングを使用するだけでいいですか?私はHighDPIサポートを追加しようとした私の古いアプリケーションの一つで、以前のQtアプリ(十分にテストされていない)
から
私のソリューションは、私はこのアプローチを使用 - DOMのすべての子を一覧表示し、それらに与えられた一つ一つのサイズを変更しますいくつかの比率。 Ratio = 1は、Qt Designerで指定した次元に等しい次元を生成します。私はこの良い解決策は考えていない
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();
}
:メインから呼び出され
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();
}
。私は新鮮な状態から始めて、自分のコードを最新のQt標準に完全にカスタマイズすることができるので、HighDPIアプリケーションを入手するにはどうすればいいですか?
Win32では、OS(GetDeviceCaps)にモニタのdpi設定を照会し、96.0で割って、env変数「QT_SCALE_FACTOR」を一致させるだけで成功しました。トレードオフがある。 Macでは、何もする必要はありませんでした。 YMMV。 – selbie
@selbie、QT_SCALE_FACTORのモニタごとのスケーリングの設定方法は? – AlexanderVX
多分、このQT_SCREEN_SCALE_FACTORS [list]は、各画面のスケール係数を指定します。これにより、ポイントサイズのフォントのサイズは変更されません。この環境変数は、主にデバッグや誤ったEDID情報(拡張ディスプレイ識別データ)を持つモニターを回避するのに便利です。しかし、誰かがアプリ内からそれを設定しようとする気になれば分かりませんか? – AlexanderVX