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?

War es hilfreich?

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top