pyQt:radioButton.isChecked()执行两次

时间:2016-04-23 08:02:47

标签: python pyqt pyqt4

我有这个简单的窗口(design.py)派生自Qt设计器,它由三个单选按钮组成:

# -*- 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'

然后按预期工作。

所以,我想当我想将许多信号连接到一个功能时会出现问题。有人可以解释这种行为吗?

任何想法都会受到赞赏。

1 个答案:

答案 0 :(得分:4)

每次任何单选按钮的状态发生变化时,都会发出toggle()信号。因此,当您单击单选按钮并且单选按钮的状态从未选中状态更改为已选中时,会发出toggle()信号,如果单击单选按钮会自动取消选中另一个单选按钮,则{{1} }信号再次发出,因为另一个单选按钮的状态从选中变为未选中状态。

您可以通过在广告位的末尾添加以下行来查看该操作:

toggle()

使用print self.sender().text() + ' was toggled' 信号 - 从未点击状态自动从已选中更改为未选中状态的单选按钮。