2014-11-12 1 views
0

필자는 PyQt의 탭 뷰와 MDI에 대해 배우고 있습니다. 탭 중 하나에있는 행 편집 위젯을 참조하는 방법이 혼란 스럽습니다. 내가 객체 관리자 볼 때 나는 참조 :MDI 애플리케이션의 속성 참조하기

MainWindow 
    centralwidget 
    mdiArea 
    subwindow 
     gridlayout 
     wt1 

내가 코드 wt1를 참조 바랍니다. 어떻게해야합니까?

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Users\218003107\AppData\Local\Continuum\Anaconda\lib\site- packages\spyderlib\widgets\externalshell\sitecustomize.py", line 580, in runfile 
    execfile(filename, namespace) 
    File "C:/Users/218003107/callphreeqcInput.pyw", line 38, in <module> 
    myapp=MyForm() 
    File "C:/Users/218003107/callphreeqcInput.pyw", line 10, in __init__ 
    self.connect(self.ui.wt1,QtCore.SIGNAL('textChanged()'),self.wtResult) 
AttributeError: 'Ui_MainWindow' object has no attribute 'wt1' 

내 코드는 다음과 같습니다 :

나는 다음과 같은 오류를 받고 있어요

import sys 
from PyQt4 import QtCore, QtGui 
from phreqMDI import Ui_MainWindow 

class MyForm(QtGui.QMainWindow, Ui_MainWindow): 
    def __init__(self, parent=None): 
     super(MyForm,self).__init__(parent) 
     self.ui=Ui_MainWindow() 
     self.ui.setupUi(self) 
     self.connect(self.ui.wt1,QtCore.SIGNAL('textChanged()'),self.wtResult) 
     self.connect(self.ui.wt2,QtCore.SIGNAL('textChanged()'),self.wtResult) 
     self.connect(self.ui.wt3,QtCore.SIGNAL('textChanged()'),self.wtResult) 
     self.connect(self.ui.wt4,QtCore.SIGNAL('textChanged()'),self.wtResult)  

    def wtResult(self): 
     if len(self.ui.wt1.text())!=0: 
      a=float(self.ui.wt1.text()) 
     else: 
      a=0 
     if len(self.ui.wt2.text())!=0: 
      b=float(self.ui.wt2.text()) 
     else: 
      b=0 
     if len(self.ui.wt3.text())!=0: 
      c=float(self.ui.wt3.text()) 
     else: 
      c=0 
     if len(self.ui.wt4.text())!=0: 
      c=float(self.ui.wt4.text()) 
     else: 
      d=0      
     sum=a+b+c+d 
     self.ui.wt_total.setText(str(sum)) 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    myapp=MyForm() 
    myapp.show() 
    app.exec_() 
+0

Qt 디자이너에서 위젯을 추가하는 두 가지 방법, 즉 다중 상속 및 구성이 혼합되어 있습니다. 'Ui_MainWindow'에서 상속 할 필요는 없지만 다른 문제를 수정하지는 않습니다. composition 메소드를 사용하면 Qt Designer의 모든 위젯이 'ui' 객체의 속성이됩니다. 그러나, 나는 진짜 문제는 당신이'phreqMDI' 모듈을 약간 변경 한 후에 다시 생성하지 않았다는 것입니다 (즉,'pyuic'을 다시 실행할 필요가 있습니다). – ekhumoro

+0

권장대로 UI_MainWindow를 삭제했습니다. 나는 또한 pyuic4를 다시 달렸다. 이번에는 프로그램이 오류를 걷어 내지 않았습니다. 주 창이 열렸지 만 위젯이나 탭이 없습니다. 내가 볼 수있는 것은 회색 MDI 영역이있는 메인 윈도우처럼 보입니다. Qt 디자이너에서 미리 볼 때 모든 위젯과 두 개의 서브 윈도우를 볼 수 있습니다. 내 응용 프로그램에는 두 개의 서브 윈도우와 하나의 서브 윈도우에 많은 행 편집 및 레이블 위젯이 있습니다. 왜 내가 서브 우드 또는 위젯을 보지 않을지에 대한 제안 사항이 있습니까? – user3720101

+0

질문에 디자이너 ui 파일을 추가하십시오. 잘못된 것을 확인하려고 노력할 것입니다. – ekhumoro

답변

0

문제는 pyuic 자동 MDI-영역에 하위 창을 추가하지 않습니다. 이것은 나에게 버그처럼 보이지만, 나는 mdi-areas 영역을 사용하지 않았기 때문에 무언가를 놓친다.

어쨌든,이처럼 하위 창을 직접 추가하여 문제를 해결할 수 있습니다

self.ui.mdiArea.addSubWindow(self.ui.subwindow) 
    self.ui.mdiArea.addSubWindow(self.ui.subwindow_2) 

은 자세한 내용은 QMdiArea docs를 참조하십시오.

UPDATE : 잘못된 서명을 사용하고 있기 때문에

이유가 신호 연결이 작동하지 않는 이유입니다. 신호를 연결하는 old-style method을 사용하는 경우는 매우 일반적인 실수, 그래서 다음과 같이 할 것 new-style method, 전환 권합니다 : 나는 여기 editingFinished 신호를 사용하는 경우에만 완료되도록 한

self.ui.wt1.editingFinished.connect(self.wtResult) 
    self.ui.wt2.editingFinished.connect(self.wtResult) 
    self.ui.wt3.editingFinished.connect(self.wtResult) 
    self.ui.wt4.editingFinished.connect(self.wtResult) 

주 항목이 평가됩니다. textChanged 신호를 사용한 경우 wtResult 메서드는 오류를 발생시키는 중간 항목 (예 : "2.")을 평가하려고 시도합니다.

입력란에 setting a validator을 입력해야 숫자 값만 입력 할 수 있습니다.

+0

와우, 나는 결코 그것을 이해하지 못했을 것이다. 정말 고마워 ! 설치 프로그램을 호출 한 후이 파일을 __init__에 넣습니다. GUI가 작동하지만 텍스트가 변경되고 wtResult에 대한 호출이 호출되지 않습니다. 이 두 문장을 잘못된 위치에 두거나 코드에 문제가있는 것입니까? – user3720101

+0

@ user3720101 다른 문제를 해결하기 위해 내 대답을 업데이트했습니다. 추가 문제가있는 경우 새로운 질문을 시작하십시오. (또한이 답변이 유용하다고 생각되면 동의라고 표시하십시오.) – ekhumoro