一尘不染

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

python

我有一个从Qt Designer派生的简单窗口 (design.py) ,其中包含三个单选按钮:

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

然后它会按预期工作。

因此,我想将多个信号连接到一个功能时会发生麻烦。有人可以解释这种行为吗?

任何想法将不胜感激。


阅读 275

收藏
2021-01-20

共1个答案

一尘不染

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

您可以通过在插槽的末尾添加以下行来查看实际情况:

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

clicked()改为使用信号-从未单击过状态自动从已选中变为未选中的单选按钮。

2021-01-20