我有一个从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'
然后它会按预期工作。
因此,我想将多个信号连接到一个功能时会发生麻烦。有人可以解释这种行为吗?
任何想法将不胜感激。
toggle()每当 任何 单选按钮的状态更改时, 都会 发出该信号。结果,toggle()当您单击单选按钮时,该信号被发射,并且该单选按钮的状态从未选中变为已选中,并且如果单击该单选按钮会自动取消选中另一个单选按钮,则该toggle()信号将再次发射,因为另一个单选按钮的状态从选中变为未选中。
toggle()
您可以通过在插槽的末尾添加以下行来查看实际情况:
print self.sender().text() + ' was toggled'
clicked()改为使用信号-从未单击过状态自动从已选中变为未选中的单选按钮。
clicked()