2016-04-23 3 views
0

я это простое окно (design.py) происходит от Qt дизайнера, который состоит из трех радиокнопок:PyQt: radioButton.isChecked() выполняется дважды

# -*- coding: utf-8 -*- 

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_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName(_fromUtf8("MainWindow")) 
     MainWindow.setEnabled(True) 
     MainWindow.resize(158, 110) 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setObjectName(_fromUtf8("centralwidget")) 
     self.myradioButton1 = QtGui.QRadioButton(self.centralwidget) 
     self.myradioButton1.setGeometry(QtCore.QRect(20, 10, 102, 22)) 
     self.myradioButton1.setObjectName(_fromUtf8("myradioButton1")) 
     self.myradioButton2 = QtGui.QRadioButton(self.centralwidget) 
     self.myradioButton2.setGeometry(QtCore.QRect(20, 40, 102, 22)) 
     self.myradioButton2.setObjectName(_fromUtf8("myradioButton2")) 
     self.myradioButton3 = QtGui.QRadioButton(self.centralwidget) 
     self.myradioButton3.setGeometry(QtCore.QRect(20, 70, 102, 22)) 
     self.myradioButton3.setObjectName(_fromUtf8("myradioButton3")) 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.statusbar = QtGui.QStatusBar(MainWindow) 
     self.statusbar.setObjectName(_fromUtf8("statusbar")) 
     MainWindow.setStatusBar(self.statusbar) 

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

    def retranslateUi(self, MainWindow): 
     MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None)) 
     self.myradioButton1.setText(_translate("MainWindow", "RadioButton1", None)) 
     self.myradioButton2.setText(_translate("MainWindow", "RadioButton2", None)) 
     self.myradioButton3.setText(_translate("MainWindow", "RadioButton3", None)) 

и я добавил этот код , чтобы контролировать, какой переключатель установлен.

# -*- coding: utf-8 -*- 

from PyQt4 import QtGui, QtCore 
import sys 
import design 

class ExampleApp(QtGui.QMainWindow, design.Ui_MainWindow): 
    def __init__(self, parent=None): 
     super(ExampleApp, self).__init__(parent) 
     self.setupUi(self) 

     self.myradioButton1.toggled.connect(self.myradioButton1_function) 
     self.myradioButton2.toggled.connect(self.myradioButton1_function) 
     self.myradioButton3.toggled.connect(self.myradioButton1_function) 

    def myradioButton1_function(self): 
     if self.myradioButton1.isChecked(): 
      print 'myradioButton1 is Checked'   
     if self.myradioButton2.isChecked(): 
      print 'myradioButton2 is Checked'   
     if self.myradioButton3.isChecked(): 
      print 'myradioButton3 is Checked'   

def main(): 
    app = QtGui.QApplication(sys.argv) 
    form = ExampleApp() 
    form.show() 
    app.exec_()   

if __name__ == '__main__': 
    main()  

Я заметил, что если radioButton1 проверяется, кажется, работает хорошо, но если radiobutton2 или radiobutton3 проверяются, сообщение проверки печатается дважды.

С другой стороны, если подключить каждый сигнал к другой функции, например:

class ExampleApp(QtGui.QMainWindow, design.Ui_MainWindow): 
    def __init__(self, parent=None): 
     super(ExampleApp, self).__init__(parent) 
     self.setupUi(self) 

     self.myradioButton1.toggled.connect(self.myradioButton1_function) 
     self.myradioButton2.toggled.connect(self.myradioButton2_function) 
     self.myradioButton3.toggled.connect(self.myradioButton3_function) 

    def myradioButton1_function(self): 
     if self.myradioButton1.isChecked(): 
      print 'myradioButton1 is Checked' 

    def myradioButton2_function(self): 
     if self.myradioButton2.isChecked(): 
      print 'myradioButton2 is Checked' 

    def myradioButton3_function(self): 
     if self.myradioButton3.isChecked(): 
      print 'myradioButton3 is Checked' 

затем он работает, как ожидалось.

Итак, я думаю, что проблема возникает, когда я хочу подключить много сигналов к одной функции. Может ли кто-нибудь объяснить это поведение?

Любые мысли будут оценены.

ответ

4

Сигнал toggle() испускается каждый раз любой состояние кнопки переключателя изменяется. В результате сигнал toggle() испускается, когда вы нажимаете на переключатель, и состояние переключателя изменяется с отметки на флажок, и если при нажатии на переключатель автоматически отключается другой переключатель, тогда сигналиспускается снова, потому что другой состояние переключателя изменяется с отмеченного на непроверенный.

Вы можете видеть, что в действии, добавив следующую строку в конец вашего слота:

print self.sender().text() + ' was toggled' 

Используйте clicked() сигнал вместо этого - кнопка радио, состояние которого была автоматически изменена с чек бесконтрольно никогда не было щелкнул.

+0

Он отлично работает. Спасибо. – user3060854