2009-09-18 44 views
3

我有一個PyQt程序用於可視化一些python對象。我想在自己的窗口中顯示多個對象。在PyQt4中的多個窗口

在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類的初始化,而不是適宜亞類的,因此將拋出異常。

我該如何調用子類的初始值設定項?有沒有更優雅的方式來做到這一點?

回答

6

爲什麼不使用對話框?在Qt中,除非你想使用docks等,否則你不需要使用主窗口。使用對話框會產生相同的效果。

我也可以在你的邏輯中看到一個問題,你需要你的超類調用它的子類的構造函數,這當然可以是任何類型的。我建議你改寫它,如下所示:

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參數)。

希望它有幫助。

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)