2014-12-20 2 views
1

Qt Designer를 사용하여 맞춤 위젯을 만들었습니다. pyuic을 사용하여 .ui 파일을 .py 파일로 변환했습니다. 내 의도는 간단합니다. 어떤 라디오 버튼이 선택되었는지 알아야합니다. PyQt : 슬롯을 여러 번 호출했습니다.

#!/usr/bin/python2.7 
# -*- coding: utf-8 -*- 

from PyQt4 import QtGui 
from ui_persistence_size import Ui_Dialog 
import sys 
import var 

class PersistenceGui(QtGui.QDialog, Ui_Dialog): 

    #def __init__(self): 
    def __init__(self, parent=None): 
     QtGui.QDialog.__init__(self, parent) 
     self.ui = Ui_Dialog() 
     self.ui.setupUi(self) 

     self.ui.cancel.clicked.connect(self.on_close_clicked) 
     self.ui.choose.clicked.connect(self.on_choose_clicked) 

    def on_close_clicked(self): 
     print "No persistence size choosen." 
     QtGui.qApp.closeAllWindows() 

    def on_choose_clicked(self): 
     if self.ui.size_256.isChecked(): 
      var.persistence_size = "256" 
     elif self.ui.size_512.isChecked(): 
      var.persistence_size = "512" 
     elif self.ui.size_768.isChecked(): 
      var.persistence_size = "768" 
     elif self.ui.size_1gb.isChecked(): 
      var.persistence_size = "1gb" 
     elif self.ui.size_2gb.isChecked(): 
      var.persistence_size = "2gb" 
     elif self.ui.size_3gb.isChecked(): 
      var.persistence_size = "3gb" 
     elif self.ui.size_4gb.isChecked(): 
      var.persistence_size = "4gb" 
      print "Selected" + var.persistence_size 
      QtGui.qApp.closeAllWindows() 
     else: 

      print "Please choose persistence size..." 
      QtGui.QMessageBox.information(self, 'No size...', 'No persistence size selected.\n\nPlease choose persistence size and click Choose.') 



if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    myapp = PersistenceGui() 
    myapp.show() 
    sys.exit(app.exec_()) 

내가 주 스크립트를 실행

, 내가 찾은 : 여기
# -*- coding: utf-8 -*- 

# Form implementation generated from reading ui file 'persistance_size2.ui' 
# 
# Created: Fri Dec 19 00:57:01 2014 
#  by: PyQt4 UI code generator 4.10.4 
# 
# WARNING! All changes made in this file will be lost! 

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(449, 129) 
     self.gridLayout_2 = QtGui.QGridLayout(Dialog) 
     self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2")) 
     self.gridLayout = QtGui.QGridLayout() 
     self.gridLayout.setObjectName(_fromUtf8("gridLayout")) 
     self.groupBox = QtGui.QGroupBox(Dialog) 
     self.groupBox.setObjectName(_fromUtf8("groupBox")) 
     self.size_256 = QtGui.QRadioButton(self.groupBox) 
     self.size_256.setGeometry(QtCore.QRect(0, 30, 81, 22)) 
     self.size_256.setObjectName(_fromUtf8("size_256")) 
     self.size_512 = QtGui.QRadioButton(self.groupBox) 
     self.size_512.setGeometry(QtCore.QRect(90, 30, 81, 22)) 
     self.size_512.setObjectName(_fromUtf8("size_512")) 
     self.size_768 = QtGui.QRadioButton(self.groupBox) 
     self.size_768.setGeometry(QtCore.QRect(179, 30, 81, 22)) 
     self.size_768.setObjectName(_fromUtf8("size_768")) 
     self.size_1gb = QtGui.QRadioButton(self.groupBox) 
     self.size_1gb.setGeometry(QtCore.QRect(262, 30, 81, 22)) 
     self.size_1gb.setObjectName(_fromUtf8("size_1gb")) 
     self.size_2gb = QtGui.QRadioButton(self.groupBox) 
     self.size_2gb.setGeometry(QtCore.QRect(352, 30, 81, 22)) 
     self.size_2gb.setObjectName(_fromUtf8("size_2gb")) 
     self.size_3gb = QtGui.QRadioButton(self.groupBox) 
     self.size_3gb.setGeometry(QtCore.QRect(0, 70, 81, 22)) 
     self.size_3gb.setObjectName(_fromUtf8("size_3gb")) 
     self.size_4gb = QtGui.QRadioButton(self.groupBox) 
     self.size_4gb.setGeometry(QtCore.QRect(90, 70, 81, 22)) 
     self.size_4gb.setObjectName(_fromUtf8("size_4gb")) 
     self.choose = QtGui.QPushButton(self.groupBox) 
     self.choose.setGeometry(QtCore.QRect(310, 68, 96, 26)) 
     self.choose.setObjectName(_fromUtf8("choose")) 
     self.cancel = QtGui.QPushButton(self.groupBox) 
     self.cancel.setGeometry(QtCore.QRect(200, 68, 96, 26)) 
     self.cancel.setObjectName(_fromUtf8("cancel")) 
     self.gridLayout.addWidget(self.groupBox, 0, 0, 1, 1) 
     self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1) 

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

    def retranslateUi(self, Dialog): 
     Dialog.setWindowTitle(_translate("Dialog", "Persistence Size Chooser...", None)) 
     self.groupBox.setTitle(_translate("Dialog", "Choose Persistence Size..", None)) 
     self.size_256.setText(_translate("Dialog", "256MB", None)) 
     self.size_512.setText(_translate("Dialog", "512MB", None)) 
     self.size_768.setText(_translate("Dialog", "768GB", None)) 
     self.size_1gb.setText(_translate("Dialog", "1GB", None)) 
     self.size_2gb.setText(_translate("Dialog", "2GB", None)) 
     self.size_3gb.setText(_translate("Dialog", "3GB", None)) 
     self.size_4gb.setText(_translate("Dialog", "4GB", None)) 
     self.choose.setToolTip(_translate("Dialog", "<html><head/><body><p>Choose selected persistance size...</p></body></html>", None)) 
     self.choose.setText(_translate("Dialog", "Choose", None)) 
     self.cancel.setToolTip(_translate("Dialog", "<html><head/><body><p>Do not choose anything and close the window.</p></body></html>", None)) 
     self.cancel.setText(_translate("Dialog", "Cancel", None)) 

내가 일하고 있다는, persistence.py 주요 스크립트입니다 : 여기

는 디자이너가 파이썬 스크립트 ui_persistence_size.py 변환입니다 두 가지 문제. 하나는 하나의 라디오 버튼 (256MB - 3GB)을 제외하고 아무것도 작동하지 않습니다. 마지막 라디오 버튼 (4GB)을 선택하면 코드가 세 번 반복됩니다.

$ ./persistence.py 
Selected4gb 
Selected4gb 
Selected4gb 

답변

3

출력이 3 번 인쇄되는 이유는 신호 처리기에 이름을 지정했기 때문입니다. clicked 신호가 오버로드를 가지고 있기 때문에

on_[object name]_[signal name] 

, 당신은 총 세 개의 연결을 만드는 연결 자신을, 명시 적으로 추가 한 다음 connect slots by name feature가 자동으로 신호 다음 형식을 사용하여 명명 된 핸들러를 연결합니다.

이 문제를 해결하는 가장 쉬운 방법은, 이런 식으로 핸들러의 이름을 변경하는 것입니다 :

 self.ui.cancel.clicked.connect(self.handleCloseClicked) 
     self.ui.choose.clicked.connect(self.handleChooseClicked) 

    def handleCloseClicked(self): 
    ... 

    def handleChooseClicked(self): 
    ... 

다른 문제는 if/elif 블록의 잘못된 처리로 인해 발생합니다. 아마도 다음과 같이 보일 것입니다 :

 ... 
     elif self.ui.size_4gb.isChecked(): 
      var.persistence_size = "4gb" 
     else: 
      print "Please choose persistence size..." 
      QtGui.QMessageBox.information(self, 'No size...', 'No persistence size selected.\n\nPlease choose persistence size and click Choose.') 
      return 
     print "Selected", var.persistence_size 
     QtGui.qApp.closeAllWindows() 
+0

정말 정확합니다. 대답을 수락했습니다. 고맙습니다. –

관련 문제