Beim Verwenden von Qt Designer zum Entwerfen grafischer Benutzeroberflächen (GUIs) für Python kann es zu einem frustrierenden Problem kommen: Änderungen Änderungen am generierten Python-Code gehen verloren, wenn die Benutzeroberfläche neu gestaltet wird. Dies kann eine erhebliche Unannehmlichkeit darstellen, insbesondere wenn Sie erheblichen Aufwand in die Anpassung des Codes für bestimmte Funktionalitäten investiert haben.
Der Schlüssel zur Lösung dieses Problems liegt in der Trennung von UI-Design aus dem Code, der die Funktionalität der UI verwaltet. Anstatt den generierten Python-Code direkt zu ändern, erstellen Sie eine neue Klasse, die das Design verwendet, aber die Logik separat verarbeitet.
Betrachten Sie das folgende Beispiel mit der MainWindow-Vorlage von Qt Designer:
Ui_MainWindow.py
from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): [...] def retranslateUi(self, MainWindow): [...]
logic.py
from Ui_MainWindow import Ui_MainWindow class Logic(QMainWindow, Ui_MainWindow): def __init__(self, *args, **kwargs): QMainWindow.__init__(self, *args, **kwargs) self.setupUi(self)
Durch die Anwendung dieses Ansatzes können Sie kann Änderungen am Design in Qt Designer vornehmen, ohne den Code in Logic.py zu beeinflussen.
Die Wahl der PyQtClass hängt von der gewählten Designvorlage ab:
Template | PyQtClass |
---|---|
Main Window | QMainWindow |
Widget | QWidget |
Dialog with Buttons Bottom | QDialog |
Dialog with Buttons Right | QDialog |
Dialog with Without Buttons | QDialog |
Diese Implementierung ermöglicht eine erweiterte Logikimplementierung innerhalb der Logikklasse, wie z Behandeln von Fensterschließereignissen. Hier ist ein Beispiel:
class Logic(QMainWindow, Ui_MainWindow): def __init__(self, *args, **kwargs): QMainWindow.__init__(self, *args, **kwargs) self.setupUi(self) def closeEvent(self, event): answer = QtWidgets.QMessageBox.question( self, 'Are you sure you want to quit ?', 'Task is in progress !', QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No) if answer == QtWidgets.QMessageBox.Yes: event.accept() else: event.ignore()
Das obige ist der detaillierte Inhalt vonWie kann ich verhindern, dass benutzerdefinierter Code verloren geht, wenn ich Qt Designer-Benutzeroberflächen neu gestalte?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!