Mehrere Fenster in PyQt4
-
22-07-2019 - |
Frage
Ich habe ein PyQt Programm verwendet, um einige Python-Objekte zu visualisieren. Ich mag Display, mehrere Objekte tun, die jeweils in einem eigenen Fenster.
Was ist der beste Weg, Multi-Fenster-Anwendungen in PyQt4 zu erreichen?
Zur Zeit habe ich die folgenden:
from PyQt4 import QtGui
class MainWindow(QtGui.QMainWindow):
windowList = []
def __init__(self, animal):
pass
def addwindow(self, animal)
win = MainWindow(animal)
windowList.append(win)
if __name__=="__main__":
import sys
app = QtGui.QApplication(sys.argv)
win = QMainWindow(dog)
win.addWindow(fish)
win.addWindow(cat)
app.exec_()
Allerdings ist dieser Ansatz nicht zufrieden stellend, da ich Probleme ist vor, wenn ich versuche, den MultipleWindows Teil in seiner eigenen Klasse ausklammern. Zum Beispiel:
class MultiWindows(QtGui.QMainWindow):
windowList = []
def __init__(self, param):
raise NotImplementedError()
def addwindow(self, param)
win = MainWindow(param) # How to call the initializer of the subclass from here?
windowList.append(win)
class PlanetApp(MultiWindows):
def __init__(self, planet):
pass
class AnimalApp(MultiWindows):
def __init__(self, planet):
pass
if __name__=="__main__":
import sys
app = QtGui.QApplication(sys.argv)
win = PlanetApp(mercury)
win.addWindow(venus)
win.addWindow(jupiter)
app.exec_()
Der obige Code wird die Initialisierung der Mainwindow-Klasse aufrufen, anstatt dass der entsprechende Unterklasse, und damit eine Ausnahme werfen.
Wie kann ich die Initialisierung der Unterklasse nennen? Gibt es eine elegantere Möglichkeit, dies zu tun?
Lösung
Warum nicht mit Dialogen? In Qt brauchen Sie nicht das Hauptfenster zu verwenden, wenn Sie etc Docks verwenden möchten .. Dialoge verwenden die gleiche Wirkung haben.
Ich kann auch ein Problem in Ihrer Logik in Bezug auf die Tatsache, dass Sie Ihre Super-Klasse wollen den Konstruktor ihrer Kinder zu rufen, was natürlich jede Art sein kann. Ich empfehle Ihnen, umschreiben es wie folgt aus:
class MultiWindows(QtGui.QMainWindow):
def __init__(self, param):
self.__windows = []
def addwindow(self, window):
self.__windows.append(window)
def show():
for current_child_window in self.__windows:
current_child_window.exec_() # probably show will do the same trick
class PlanetApp(QtGui.QDialog):
def __init__(self, parent, planet):
QtGui.QDialog.__init__(self, parent)
# do cool stuff here
class AnimalApp(QtGui.QDialog):
def __init__(self, parent, animal):
QtGui.QDialog.__init__(self, parent)
# do cool stuff here
if __name__=="__main__":
import sys # really need this here??
app = QtGui.QApplication(sys.argv)
jupiter = PlanetApp(None, "jupiter")
venus = PlanetApp(None, "venus")
windows = MultiWindows()
windows.addWindow(jupiter)
windows.addWindow(venus)
windows.show()
app.exec_()
Es ist keine gute Idee der Super-Klasse kennen, um die Parameter zu erwarten in der init verwendet werden ihre Unterklassen, da es wirklich hart, um sicherzustellen, dass alle des Konstruktor wird das gleiche sein (vielleicht das Tier Dialog / Fenster nimmt diff Parameter).
Hoffe, es hilft.
Andere Tipps
Um die Unterklasse zu verweisen, die die Super-Klasse aus dem Innern der Super-Klasse erben, ich bin mit self.__class__()
, so dass die MultiWindows Klasse lautet nun:
class MultiWindows(QtGui.QMainWindow):
windowList = []
def __init__(self, param):
raise NotImplementedError()
def addwindow(self, param)
win = self.__class__(param)
windowList.append(win)