문제

일부 파이썬 객체를 시각화하는 데 사용되는 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_()

그러나이 접근법은 자체 클래스에서 다중 감상 부분을 고려하려고 할 때 문제에 직면하기 때문에 만족스럽지 않습니다. 예를 들어:

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

위의 코드는 적절한 서브 클래스의 초기 클래스의 이니셜 라이저를 호출하므로 예외가 발생합니다.

서브 클래스의 이니셜 라이저를 어떻게 호출 할 수 있습니까? 더 우아한 방법이 있습니까?

도움이 되었습니까?

해결책

대화 상자를 사용하지 않는 이유는 무엇입니까? 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 매개 변수를 가져옵니다).

도움이되기를 바랍니다.

다른 팁

슈퍼 클래스 내부에서 슈퍼 클래스를 상속하는 서브 클래스를 참조하기 위해 self.__class__(), 따라서 멀티 윈도우 클래스는 이제 읽습니다.

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

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

def addwindow(self, param)
    win = self.__class__(param)
    windowList.append(win)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top