Ich habe die offizielle Qt documentation und viele Artikel und Fragen zu StackOverflow über hohe DPI-Unterstützung in Qt gelesen. Sie alle konzentrieren sich darauf, alte Anwendungen zu portieren und sie so wenig wie möglich zu verändern.Wie wird die Entwicklung einer neuen Qt 5.7+ High-DPI Pro Monitor DPI Aware-Anwendung angegangen?
Aber wenn ich eine brandneue Anwendung starten würde, mit der Absicht, DPI-bewusste App pro Monitor zu unterstützen, was ist der beste Ansatz? Wenn ich richtig verstehe, Qt::AA_EnableHighDpiScaling
ist das genaue Gegenteil von dem, was ich will. Ich sollte eigentlich HighDpiScaling deaktivieren und alle Dimensionen manuell zur Laufzeit berechnen?
Viele der Vorschläge sagen, keine Größen zu verwenden, um schwebende Layouts zu verwenden. In vielen Fällen ist es jedoch wünschenswert, dass zumindest eine minimale Breite und/oder eine minimale Höhe vorhanden ist. Da Qt Designer nur erlaubt, Werte in absoluten Pixeln zu setzen, was ist der richtige Ansatz? Wo sollte ich den Code platzieren, um die Abmessungen neu zu berechnen, wenn sich die Bildschirmauflösung ändert?
Oder sollte ich einfach mit der automatischen Skalierung gehen?
Meine Lösung aus früheren Qt app (nicht gut getestet)
In einem meiner älteren Anwendungen, wo ich versuchte HighDPI Unterstützung hinzufügen, ich diesen Ansatz - Liste alle Kinder von DOM und sie eins nach dem anderen die Größe gegeben etwas Verhältnis. Verhältnis = 1 würde Dimensionen erzeugen, die denen entsprechen, die ich in Qt Designer angegeben habe.
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();
}
die von den wichtigsten genannt:
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();
}
ich dies nicht berücksichtigen eine gute Lösung. Da ich gerade neu starte und meinen Code vollständig an die neuesten Qt-Standards anpassen kann, welchen Ansatz sollte ich für HighDPI-Apps verwenden?
Auf Win32 haben wir erfolgreich gefunden, einfach das Betriebssystem (GetDeviceCaps) für die Monitor-dpi-Einstellung abzufragen, dividieren durch 96,0 und die env-Variable 'QT_SCALE_FACTOR' passend zu setzen. Es gibt Kompromisse. Auf Mac mussten wir nichts tun. YMMV. – selbie
@selbie, wie Einstellung QT_SCALE_FACTOR Adresse pro Monitor Skalierung? – AlexanderVX
Vielleicht gibt diese QT_SCREEN_SCALE_FACTORS [Liste] Skalierungsfaktoren für jeden Bildschirm an. Dies ändert nicht die Größe von Schriftarten in Punktgröße. Diese Umgebungsvariable ist hauptsächlich zum Debuggen oder zum Arbeiten mit Monitoren mit falschen EDID-Informationen (Extended Display Identification Data) nützlich. Aber unsicher, jemand kümmert sich darum, es aus der App heraus zu setzen? – AlexanderVX