문제
일부 파이썬 객체를 시각화하는 데 사용되는 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)
제휴하지 않습니다 StackOverflow