2015-01-06 6 views
4

저는 Python과 PyQt를 배우기 시작합니다. 현재 QDesigner 폼에서 생성 된 Dialog 폼을 사용하여 신호와 슬롯을 연결하는 것과 관련된 매우 기본적인 문제로 싸우고 있습니다. QDialog에서 푸시 버튼을 연결하고 싶습니다. 이 코드는 오류를 생성하지 않습니다. 대화 상자가 예상대로 표시됩니다. 그러나 푸시 버튼을 클릭하면 아무 일도 일어나지 않습니다.PyQt : QDesigner 및 연결 푸시 버튼에서 대화 상자 마무리하기

또는 코드 예제 Ui_Dialog을 직접 내 대상 클래스 Testdialog에 포함 시키려고했습니다. 그런 다음 연결이 작동하고있었습니다. 내가 Ui_Dialog에서 Testdialog으로 속성을 상속하는 데 오류가있는 것처럼 보입니다. 그리고/또는 대화 상자를 실행하고 싶습니다.

내 주요 프로그램과 같이 보인다 :

from __future__ import unicode_literals 
import sys 

from PyQt4 import * 
from PyQt4 import QtGui 
from PyQt4.QtCore import SIGNAL, QObject 

import UI_Test 



class Testdialog(QtGui.QDialog, UI_Test.Ui_Dialog): 
    def __init__(self,parent=None): 
     super(Testdialog, self).__init__(parent) 
     self.setupUi(self) 
     print("Connect buttons") # gives the expected output 

     self.connect(self.pushButton_Ok, SIGNAL("clicked()"), self.clickedOk) 
     self.connect(self.pushButton_Cancel, SIGNAL("clicked()"), self.clickedCancel) 

     # Alternativly I have tríed the following without improvement: 
     # self.pushButton_Ok.clicked.connect(self.clickedOk) 
     # QObject.connect(self.pushButton_Cancel, SIGNAL("clicked()"), self.clickedCancel) 


    def clickedCancel(self): 
     print ("Cancel") # Question: Why is nothing happening here? 


    def clickedOk(self): 
     print ("Ok")  # Question: Why is nothing happening here? 



if True: 
    qApp = QtGui.QApplication(sys.argv) 
    Dialog = QtGui.QDialog() 
    u = Testdialog() 
    u.setupUi(Dialog) 
    Dialog.exec_() 
    sys.exit(qApp.exec_()) 

내가 아무 일도 발생하지 않는 bushbuttons 클릭

. 연결이 작동하지 않는 것 같습니다.

내가 뭘 잘못 했니? 어떻게 그걸 고쳐? 그 밖의 무엇을 개선해야합니까?

양식 UI_Test.py은 QtDesigner 및 pyuic에서 자동으로 생성되므로 별다른 의미가 없습니다. 그래서 기본적으로 (코드에 대한 모든 세부 사항을 이해하지는 못하더라도) 괜찮을 것입니다.

# File: UI_Test.py 
from PyQt4 import QtCore, QtGui 

try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    def _fromUtf8(s): 
     return s 

try: 
    _encoding = QtGui.QApplication.UnicodeUTF8 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig, _encoding) 
except AttributeError: 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig) 

class Ui_Dialog(object): 
    def setupUi(self, Dialog): 
     Dialog.setObjectName(_fromUtf8("Dialog")) 
     Dialog.resize(271, 70) 
     self.pushButton_Ok = QtGui.QPushButton(Dialog) 
     self.pushButton_Ok.setGeometry(QtCore.QRect(20, 20, 93, 28)) 
     self.pushButton_Ok.setObjectName(_fromUtf8("pushButton_Ok")) 
     self.pushButton_Cancel = QtGui.QPushButton(Dialog) 
     self.pushButton_Cancel.setGeometry(QtCore.QRect(130, 20, 93, 28)) 
     self.pushButton_Cancel.setObjectName(_fromUtf8("pushButton_Cancel")) 

     self.retranslateUi(Dialog) 
     QtCore.QMetaObject.connectSlotsByName(Dialog) 

    def retranslateUi(self, Dialog): 
     Dialog.setWindowTitle(_translate("Dialog", "Dialog", None)) 
     self.pushButton_Ok.setText(_translate("Dialog", "OK", None)) 
     self.pushButton_Cancel.setText(_translate("Dialog", "Cancel", None)) 
+1

문제가있는 정확한 위치를 식별하려면 작은 예제를 만들어야합니다. 이 예제에는 문제와 관련이없는 많은 코드가 있습니다. 행운을 빕니다! – Plouff

+0

코멘트 Plouff에 감사드립니다. 'UI_Test.py'파일은 'pyuic'으로 자동 생성됩니다. 기본적으로 여기에 문제가 없어야합니다. 실행중인 예제를 제공하기 위해 추가되었습니다. 'Ud_Dialog'클래스의 코드를 'Testdialog'에 포함하려고했습니다. 이 경우 programm가 작동합니다. 그래서 나는이 문제가 내가 'Testdialog'클래스가 'Ui_Dialog'에서 상속받은 방식으로 발생한다고 예상한다. 또는 Dialog가 메인 클래스에서 실행되는 방식.그래서 불행히도 예제를 줄이고 동일한 행동을 유지할 수있는 방법을 찾지 못했습니다. – BerndGit

+0

좋아, 나는 [link] (http://pyqt.sourceforge.net/Docs/PyQt4/designer.html)의 도움 요청서 (예 2)로 해결할 수있다. 어쨌든 초기 버전이 작동하지 않는 이유는 아직도 이해할 수 없습니다. – BerndGit

답변

4

원래 코드의 문제는이 섹션에 있습니다

if __name__ == '__main__': 

    app = QtGui.QApplication(sys.argv) 
    u = Testdialog() 
    u.show() 
    sys.exit(app.exec_()) 

원래의 코드가 작동하지 않는 이유는 다음과 같습니다

if True: 
    qApp = QtGui.QApplication(sys.argv) 
    Dialog = QtGui.QDialog() 
    u = Testdialog() 
    u.setupUi(Dialog) 
    Dialog.exec_() 
    sys.exit(qApp.exec_()) 

당신이 대신 원하는 것은이 같은 것입니다 왜냐하면 신호 연결은 __init__Testdialog 인 경우에만 발생하기 때문입니다. 생성 한 Testdialog의 인스턴스에는 모든 ui가 추가되어 있고 모든 신호가 올바르게 연결되어 있지만 실제로는 표시하지 않습니다! 대신 다른 대화 상자 (예 : Dialog)를 표시합니다 (setupUi을 통해) 사본에 동일한 UI가 추가되었습니다 (신호 연결없이).

+0

감사합니다, 에쿠 모로. 그것은 많은 것을 설명합니다. 왜냐하면 나는 완벽한 이해없이 그물에서 코드를 복사했기 때문이다. 이제는 훨씬 더 명확 해졌습니다. – BerndGit

1

이봐 그래서 여기 내 대답입니다 : 은 실행 예제를 제공하기 위해, 여기에 코드입니다.

import sys 
from PyQt4 import QtGui, QtCore 
from PyQt4.Qt import pyqtSlot 

class MyDialog(QtGui.QDialog): 
    def __init__(self): 
     super(MyDialog, self).__init__() 
     self.resize(271, 70) 
     self.pushButton_Ok = QtGui.QPushButton(self) 
     self.pushButton_Ok.setGeometry(QtCore.QRect(20, 20, 93, 28)) 
     self.pushButton_Ok.setText("Ok") 

     self.pushButton_Cancel = QtGui.QPushButton(self) 
     self.pushButton_Cancel.setGeometry(QtCore.QRect(130, 20, 93, 28)) 
     self.pushButton_Cancel.setText("Cancel") 

     # HERE the slots are connected 
     self.pushButton_Ok.clicked.connect(self.clickedOk) # new style signal/slot 
     self.pushButton_Cancel.clicked.connect(self.clickedCancel) # new style signal/slot 

    @pyqtSlot() 
    def clickedCancel(self): 
     print ("Cancel pressed") 

    @pyqtSlot() 
    def clickedOk(self): 
     print ("Ok pressed") 

qApp = QtGui.QApplication(sys.argv) 
dial = MyDialog() 
dial.show() 
sys.exit(qApp.exec_()) 

난 당신이 내가 QtDesigner를 사용하지 않는과 의미 지금 무엇을보고 희망 : 난 그냥 QtDesigner (방금 붙여 넣은 꼬맹 복사)없이 같은 예를했다. 이 예제와 같이 훨씬 명확하고 코드가 적으므로 백그라운드에서 진행되는 작업을보다 잘 이해할 수 있습니다. 내 대답이 너를 도왔 으면 좋겠어.

+0

의견을 보내 주셔서 감사합니다. 내 질문의 두 번째 단락에서 언급했듯이, 나는 비슷한 예를 (상속받지 않고) 이미 사용했다. QtDesinger는 또한 편안함을 제공하기 때문에 그것을 사용하고 싶습니다. 어쨌든 시간을 내 주셔서 감사합니다. – BerndGit