2009-09-18 3 views
3

私はいくつかのpythonオブジェクトを視覚化するためにPyQtプログラムを使用しています。複数のオブジェクトをそれぞれ独自のウィンドウで表示したいと思います。PyQt4の複数のWindows

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

は、上記のコードではなく、適切なサブクラスのものよりも、メインウィンドウのクラスのイニシャライザを呼び出すので、例外がスローされます。

どのようにしてサブクラスの初期化子を呼び出すことができますか?これを行うよりエレガントな方法はありますか?

答えて

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パラメータを取るかもしれません)。

希望します。

0

MultiWindowsクラスは今読み込むので、スーパークラス内からスーパークラスを継承しているサブクラスを参照するために、私は、self.__class__()を使用しています:

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

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

def addwindow(self, param) 
    win = self.__class__(param) 
    windowList.append(win) 
関連する問題