3

我有一个用于可视化一些 python 对象的 PyQt 程序。我想显示多个对象,每个对象都在自己的窗口中。

在 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 类的初始化程序,而不是相应子类的初始化程序,因此会抛出异常。

如何调用子类的初始化程序?有没有更优雅的方法来做到这一点?

4

2 回答 2

6

为什么不使用对话框?在 Qt 中,除非您想使用停靠栏等,否则您不需要使用主窗口。使用对话框将具有相同的效果。

我还可以在您的逻辑中看到一个问题,即您希望您的超类调用其子类的构造函数,这当然可以是任何类型。我建议你像下面这样重写它:

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

期望超类知道要在其子类的init中 使用的参数不是一个好主意,因为很难确保所有构造函数都相同(也许动物对话框/窗口采用 diff 参数) .

希望能帮助到你。

于 2009-09-18T08:15:15.577 回答
0

为了引用从超类内部继承超类的子类,我使用的是self.__class__(),所以 MultiWindows 类现在读取:

class MultiWindows(QtGui.QMainWindow):
windowList = []

def __init__(self, param):
    raise NotImplementedError()

def addwindow(self, param)
    win = self.__class__(param)
    windowList.append(win)
于 2009-09-18T03:57:36.267 回答