2016-04-23 54 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()信号,并且如果单击单选按钮会自动取消选中另一个单选按钮,则会再次发射toggle()信号,因为另一个单选按钮单选按钮的状态从勾选变为未勾选。

你可以看到,在行动中加入下面一行到你的槽的末端:

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

使用clicked()信号,而不是 - 一个单选按钮,其状态已自动从检查未经检查的改变从来没有点击。

+0

它工作正常。谢谢。 – user3060854