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

すべてのコンストラクターが同じになることを保証するのは非常に難しいため、スーパークラスがそのサブクラスの初期化で 使用されるパラメーターを知っていると期待するのは良い考えではありません(おそらく動物のダイアログ/ウィンドウは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 に答える