2014-05-19 3 views
1

마지막 질문부터 계속 전진합니다. 상위 위젯의 내용을 하위 위젯에서 업데이트하려고합니다. 코드가 처음에는 작동하지만 폼 위젯을 닫았다가 다시 열면 상위 위젯이 업데이트되지 않습니다.다른 위젯에서 pyqt 위젯 컨텐츠 업데이트하기

다음은 코드입니다.

from PyQt4 import QtGui, QtCore 
from functools import partial 
import sys 


class MainWidget(QtGui.QWidget): 
    def __init__(self): 
     super(MainWidget, self).__init__() 

     self.main_widget() 

    def main_widget(self): 
     self.form = Form() 
     self.simple = Simple() 
     grid = QtGui.QGridLayout() 


     self.last_input_label = QtGui.QLabel("") 
     grid.addWidget(self.last_input_label, 1, 0, 3, 1) 

     show_form_button = QtGui.QPushButton("Show Form") 
     show_form_button.clicked.connect(partial(self.form.show_form, self.last_input_label)) 
     grid.addWidget(show_form_button, 0, 0) 

     show_simple_button = QtGui.QPushButton("Show Simple") 
     show_simple_button.clicked.connect(self.simple.show_simple) 
     grid.addWidget(show_simple_button, 0, 1) 

     another_button = QtGui.QPushButton("Print Hello") 
     another_button.clicked.connect(partial(print, "Hello")) 
     grid.addWidget(another_button, 0, 2) 

     self.setLayout(grid) 
     self.setWindowTitle("Main Widget") 
     self.show() 

    def closeEvent(self, QCloseEvent): 
     QtGui.QApplication.closeAllWindows() 


class Form(QtGui.QWidget): 
    def __init__(self): 
     print("form initialized") 
     super(Form, self).__init__() 

    def show_form(self, last_input_label): 
     print("form called") 
     grid = QtGui.QGridLayout() 

     self.last_input_label = last_input_label 

     label = QtGui.QLabel("Name") 
     grid.addWidget(label, 0, 0) 


     self.line_edit = QtGui.QLineEdit() 
     grid.addWidget(self.line_edit, 0, 1) 

     self.submit_button = QtGui.QPushButton("Submit") 
     self.submit_button.clicked.connect(self.print_form_data) 
     grid.addWidget(self.submit_button, 1, 1) 

     self.setLayout(grid) 
     self.setGeometry(250, 300, 250, 150) 
     self.setWindowTitle("Form Widget") 
     self.show() 

    def get_form_data(self): 
     form_data = { 
      "name": self.line_edit.text() 
     } 
     return form_data 

    def print_form_data(self): 
     self.x = self.get_form_data() 
     for item in self.x: 
      print(item + ": " + self.x[item]) 
      self.last_input_label.setText(self.x[item]) 

     return 


class Simple(QtGui.QDialog): 
    def __init__(self): 
     print("simple initialized") 
     super(Simple, self).__init__() 

    def show_simple(self): 
     print("simple called") 
     self.setGeometry(300, 250, 250, 150) 
     self.setWindowTitle("Simple Widget") 
     self.show() 

def main(): 
    app = QtGui.QApplication(sys.argv) 
    main_widget = MainWidget() 
    sys.exit(app.exec_()) 


if __name__ == "__main__": 
    main() 

제발 도와주세요!

답변

1

위젯을 표시 할 때마다 초기화 코드가 호출됩니다. 모든 정보를 속한 __init__ 메소드로 이동하면 모든 것이 작동합니다.

이 모든 것을 init 메소드로 옮깁니다. init 코드를 더 많이 실행하면 연결이 끊어지는 이유는 정확히 말할 수 없습니다. 그러나 어떻게 든 그것은한다. 어쩌면 다른 사람이 그 세부 사항을 채울 수 있습니다.

+0

고맙습니다. 또한 self.line_edit = QtGui.QLineEdit()를 __init__ 메소드로 옮기는 것만으로도 작업을 수행 할 수 있다는 것을 알아 냈습니다. 하지만 레이아웃을 위해서 모든 초기화 문을 __init__ 메쏘드로 옮겼다. 이제는 모두 잘 동작한다. – Haroon

관련 문제