2011-11-24 2 views
2

나는 PyQT4에서 새로운 것이고 나는 아래의 문제에 직면했다.PyQT4 - 메인 창에서 위젯 바꾸기

일부 응용 프로그램은 한 화면에 사용자 데이터를 수집하고 버튼 클릭시 다음 화면을 표시해야합니다. 먼저 위젯

main.py

app = QtGui.QApplication(sys.argv) 
#here I create main window with inherited class 
w = SAN_MainWindow() 
#and apply some basic geometry 
w.SetUI() 
#here first screen rendered and button event applyed 
w.ApplyWidget(SAN_Intro()) 
w.show() 
sys.exit(app.exec_()) 

렌더링 올바르게 발생한다.

는 SAN_MainWindow.py :

class SAN_MainWindow(QtGui.QMainWindow): 
    def __init__(self): 
     super(SAN_MainWindow, self).__init__() 

    def SetUI(self): 
     self.setObjectName(_fromUtf8("MainWindow")) 
     self.resize(789, 602) 
     self.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8)) 
     self.central_widget = QtGui.QWidget(self) 
     self.central_widget.setObjectName(_fromUtf8("central_widget")) 
     self.setCentralWidget(self.central_widget) 

    def ApplyWidget(self, widget): 
     self.active_widget = widget 
     self.active_widget.Setup(self.central_widget) 
     self.active_widget.SetControls(self) 

    def RemoveActiveWidget(self): 
     self.active_widget.widget().setParent(None) 

    def ShowInstruction(self): 
     self.RemoveActiveWidget() 
     self.ApplyWidget(SAN_Instruction()) 
     #self.centralWidget().update() <- Problem 

SAN_Intro.py :

:

class SAN_Intro(object): 
    def __init__(self): 
     super(SAN_Intro, self).__init__() 

    def Setup(self, widget): 
     self.gridLayoutWidget = QtGui.QWidget(widget) 
     self.gridLayoutWidget.setGeometry(QtCore.QRect(80, 30, 638, 451)) 
     self.gridLayoutWidget.setObjectName(_fromUtf8("gridLayoutWidget")) 
     self.gridLayout = QtGui.QGridLayout(self.gridLayoutWidget) 
     self.gridLayout.setContentsMargins(-1, 16, 16, -1) 
     self.gridLayout.setObjectName(_fromUtf8("gridLayout")) 
     #a lot of form inputs instructions.... 
    def SetControls(self, main_window): 
     QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL("clicked()"), main_window.ShowInstruction) 

    def widget(self): 
     return self.gridLayoutWidget 

SAN_Instruction 설치 프로그램에서 다른 명령을하지만, 거의 SAN_Intro과 동일

class SAN_Instruction(object): 

    def __init__(self): 
     super(SAN_Instruction, self).__init__() 

    def Setup(self, widget): 
     self.verticalLayoutWidget = QtGui.QWidget(widget) 
     self.verticalLayoutWidget.setGeometry(QtCore.QRect(40, 20, 591, 521)) 
     self.verticalLayoutWidget.setObjectName(_fromUtf8("verticalLayoutWidget")) 
     self.verticalLayout = QtGui.QVBoxLayout(self.verticalLayoutWidget) 
     self.verticalLayout.setMargin(0) 
     self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) 
     #a lot of form inputs instructions.... 

    def SetControls(self, main_window): 
     pass 

    def widget(self): 
     return self.verticalLayoutWidget 

그리고 여기에 질문이 있습니다 : 두 번째 (SAN_Instruction으로 생성) 위젯을 어떻게 표시해야합니까? mainwindow/centralwidget/parent를 업데이트/표시/다시 채색하려고했습니다. 버튼 클릭으로 얻은 것은 self.RemoveActiveWidget()입니다.

아마도 내 개념이 잘못 되었나요? 사전

+0

파이썬의 코드는 탭이 아니라 4 개의 공백으로 들여 쓰기되어야합니다. [PEP8] (http://www.python.org/dev/peps/pep-0008/)을보십시오. 게시 할 때이 규칙을 존중해야합니다. (이번에 당신을 위해 고쳐졌습니다!) – mac

+0

고마워, 나는 그것을 염두에 두겠다. – user3777

답변

2

고맙습니다, 당신의 코드는 완전하지 않습니다하지만 난 숨기기() 메소드를 활용하도록 권합니다. 버튼 기능에서이를 정의하여 표시하지 않으려는 모든 위젯을 숨길 수 있으며, 같은 함수에서 해당 위치에 표시 할 위젯을 호출 할 수 있습니다. 그렇게하면 프로젝트를보다 체계적이고 쉽게 추적하고 디버깅 할 수 있기 때문에 그렇게 할 수 있습니다. 또한 필요에 따라 show() 메소드를 사용하여 위젯을 다시 볼 수 있습니다.

+0

고마워, 나는 그것이 적절한 해결책이라고 생각한다. – user3777

0

"QtGui.QStackedWidget()"을 사용할 수 있습니다. Window를 여러 프레임으로 나눠서 각 프레임을 QStackedWidget()에 추가하고 setCurrentWidget() 함수를 사용하여 표시 할 프레임을 선택합니다 (프레임 간 전환).

self.central_widget.addWidget(self.mainFrame) 
self.central_widget.setCurrentWidget(self.mainFrame) 
관련 문제