我有一个pyqt程序用来可视化一些python对象。我想显示多个对象,每个都在自己的窗口中。
在pyqt4中实现多窗口应用程序的最佳方法是什么?
目前我有以下几点:

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_()

然而,这种方法并不令人满意,因为当我试图将multiplewindows部分分解到它自己的类中时,我面临一些问题。例如:
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_()

上面的代码将调用MainWindow类的初始值设定项,而不是相应子类的初始值设定项,因此将抛出异常。
如何调用子类的初始值设定项?有没有比这更优雅的方法?

最佳答案

为什么不使用对话框在Qt中,除非您想使用docks等,否则不需要使用主窗口使用对话框将具有相同的效果。
我还可以看到你的逻辑中有一个问题,你希望你的超级类调用它的子类的构造函数,当然它可以是任何类型。我建议你重写如下:
ojit_pre
期望超级类知道要在其子类的in It中使用的参数不是一个好主意,因为很难确保所有构造函数都是相同的(可能animal对话框/窗口采用diff参数)。
希望有帮助。

08-18 14:10