Ich arbeite an einer Anwendung, die viele Widgets verwendet (QGroupBox, QVBoxLayout, QHBoxLayout). Ursprünglich wurde es auf normalen HD-Monitoren entwickelt. Vor kurzem haben viele von uns ein Upgrade auf Monitore mit 4K-Auflösung durchgeführt. Jetzt sind einige der Schaltflächen und Schieberegler so klein komprimiert, dass sie unbrauchbar werden.
Jetzt habe ich versucht, einige Änderungen vorzunehmen, damit die Anwendung sowohl mit HD- als auch mit 4K-Monitoren verwendet werden kann.
Ich fing an, den folgenden Link zu lesen:
https://leomoon.com/journal/python/high-dpi-scaling-in-pyqt5/ Geben Sie hier die Linkbeschreibung ein
Ich dachte, wann immer mein Fenster in einem bestimmten Monitor geöffnet wird, kann ich den folgenden Code aufrufen:
if pixel_x > 1920 and pixel_y > 1080:
Qapp.setAttribute(Qt.AA_EnableHighDpiScaling, True)
Qapp.setAttribute(Qt.AA_UseHighDpiPixmaps, True)
else:
Qapp.setAttribute(Qt.AA_EnableHighDpiScaling, False)
Qapp.setAttribute(Qt.AA_UseHighDpiPixmaps, False)
Dann habe ich versucht, die Monitorauflösung (pixel_x und pixel_y) mithilfe des folgenden Codes zu ermitteln, indem ich hier einen verwandten Beitrag verwendet habe .
import sys, ctypes
user32 = ctypes.windll.user32
user32.SetProcessDPIAware()
screen_width = 0 #78
screen_height = 1 #79
[pixel_x , pixel_y ] = [user32.GetSystemMetrics(screen_width), user32.GetSystemMetrics(screen_height)]
screen_width = 0, screen_height = 1
gibt mir die Auflösung meines primären Monitors (meistens Laptops in unserem Fall, die HD sind). screen_width = 78, screen_height = 79
gibt mir die kombinierte Auflösung von virtuellen Maschinen. Ich verstehe jedoch nicht, wie ich diese Werte dynamisch abrufen kann, je nachdem, wo meine Anwendung geöffnet wurde.
Mein Anwendungsfenster ist so entwickelt, dass es auf demselben Monitor geöffnet wird, auf dem es zuletzt geschlossen wurde. Das Problem ist jetzt, dass ich die aktive Monitorauflösung erhalten möchte, wenn meine GUI aufgerufen wird, und mich an diese Auflösung anpassen möchte. Ich würde mich freuen, wenn mir jemand helfen kann.
Ich bin interessiert zu wissen, ob ich die Berechnung der Bildschirmauflösung jedes Mal aufrufen kann, wenn ich mein Fenster von einem HD-Monitor auf einen 4K-Monitor ziehe und umgekehrt.
Edit: Ich habe in diesem Beitrag hier etwas Ähnliches gefunden aber ich konnte nicht viel davon bekommen.
Edit2: Basierend auf der @ Joe-Lösung, Primary Screen Detection, Warum ist mein primärer Bildschirm immer meine Laptop-Auflösung, obwohl ich die Anwendung auf einem 4K-Bildschirm ausführe?
Ich habe gerade versucht, die dpi aller Bildschirme mit dem folgenden Code zu erhalten:
def screen_selection():
app = QApplication(sys.argv)
valid_screens = []
for index, screen_no in enumerate(app.screens()):
screen = app.screens()[index]
dpi = screen.physicalDotsPerInch()
valid_screens.append(dpi)
return valid_screens
quelle
QWidget
Sie hier sehen können, unterstützt jedoch jeder diese Methode .QMainWindow
UnterklassenQWidget.
Ich habe auch meinen Code getestet und es hat funktioniert. Bitte überprüfen Sie nur, ob es auch für Sie funktioniert.QMainWindow
und Überladen der zu verwendenmoveEvent
. Dies funktioniert zu 100% und bietet Ihnen mehr Funktionalität. Sie können einfach den von mir bereitgestellten Code nehmen und verwenden. Der Code funktioniert einwandfrei und ich erhalte das richtigescreenChanged
Signal, wenn ich das `` MainWindow` auf einem anderen Bildschirm bewege.PyQt5
Version ist 5.13.2. Sie können hier sehen, dass die offizielle PyQt5-Referenz auch dieQApplication.screenAt
Methode auflistet .Eine Lösung kam ich über ist eine vorübergehende zu verwenden
QApplication()
:Diese Funktion erkennt alle angehängten Bildschirme:
Sie können die Hinweise hier und hier verwenden , um den Bildschirm zu erhalten, auf dem die Anwendung ausgeführt wird.
Aber ich denke,
primaryScreen
sollte auch dies zurückgeben:( https://doc.qt.io/qt-5/qguiapplication.html#primaryScreen-prop )
quelle
app.primaryScreen()
, welcher Bildschirm verwendet wird.Obwohl ich nicht die direkte Lösung finden konnte, kann ich eine Methode entwickeln, um das zu bekommen, wonach ich gesucht habe. Mit Hilfe von wenigen Links und vorherigem Beitrag kann ich erreichen. Mit diesem Beitrag kam mir die Idee, das Mausereignis zu verfolgen.
Ich habe eine Methode entwickelt, um alle Monitore und die jeweiligen Blickpositionen zu verfolgen. Wenn meine Variablennamen nicht angemessen sind, akzeptiere ich die Änderungen gerne
Mit aboe können zwei Funktionen die Position meiner Anwendung (Fenster) verfolgen und auch, wann immer sie zwischen Fenstern gezogen wird
quelle