pyQt:radioButton.isChecked() 执行两次 [英] pyQt: radioButton.isChecked() is executed twice

查看:96
本文介绍了pyQt:radioButton.isChecked() 执行两次的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have this simple window (design.py) derived from Qt designer, which consists of three radio buttons:

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

并且我添加了此代码,以便监控选中了哪个单选按钮.

and I have added this code, in order to monitor which radio button is checked.

# -*- 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,则检查消息会打印两次.

I noticed that if radioButton1 is checked, it seems to work fine, but if radiobutton2 or radiobutton3 are checked, the check message is printed twice.

另一方面,如果我将每个信号连接到不同的函数,如下所示:

On the other hand, if I connect every signal to a different function, like this:

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'

然后它按预期工作.

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

So, I guess that the trouble occurs when I want to connect many signal to one function. Could someone explain this behavior?

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

Any thoughts would be appreciated.

推荐答案

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

The toggle() signal is emitted every time any radio button's state changes. As a result, the toggle() signal is emitted when you click on a radio button and that radio button's state changes from unchecked to checked, and if clicking on the radio button automatically unchecks another radio button, then the toggle() signal is emitted again because the other radio button's state changes from checked to unchecked.

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

You can see that in action by adding the following line to the end of your slot:

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

改用 clicked() 信号——状态自动从选中变为未选中的单选按钮从未被点击过.

Use the clicked() signal instead--a radio button whose state was automatically changed from checked to unchecked was never clicked.

这篇关于pyQt:radioButton.isChecked() 执行两次的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆