Skip to main content
 首页 » 编程设计

python之pyQt: radioButton.isChecked() 被执行了两次

2025年05月04日25虾米姐

我有这个简单的窗口 (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' 

然后它按预期工作。

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

如有任何想法,我们将不胜感激。

请您参考如下方法:

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

您可以通过将以下行添加到插槽的末尾来查看实际效果:

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

改为使用 clicked() 信号——从未单击状态自动从选中更改为未选中的单选按钮。