在PyQt中使用复选框

10

1) 我的UI中使用Qt Designer创建了一个名为"ch_check"的复选框,需要进行测试。

2) 还有一个按钮"bt_button",它会触发一个简单的函数:

self.dlg.bt_button.clicked.connect(self.doCheck)

3) 函数:

def doCheck(self):
    if ch_check.isChecked():
        self.dlg.le_text.setText("Hello")
    else:
        self.dlg.le_text.setText("Nope")
然而我无法正确引用该框,我该怎么做呢?我需要先连接复选框吗?到目前为止,我找到的所有示例都使用复选框来触发函数等,完全忽略了这种基本用法。我找到了这个问题,但它没有回答如何处理现有复选框: 如何在pyqt中检查复选框是否已选中
2个回答

23
你可以使用StateChanged信号来完成此操作。在本例中,我们有一个简单的.ui文件和一个简单的.py文件:

.ui文件定义了两个小部件。一个复选框(ch_check)和一个单独的QLabel(my_label)。

Python文件:

from PyQt4 import QtCore
from PyQt4 import QtGui 
import sys
from test_ui import Ui_MainWindow

class CheckDialog(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QWidget.__init__(self)

        # Set up the user interface from Designer.
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.ch_check.stateChanged.connect(self.state_changed)

    def state_changed(self, int):
        if self.ui.ch_check.isChecked():
            self.ui.my_label.setText("CHECKED!")
        else:
            self.ui.my_label.setText("UNCHECKED!")


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    window = CheckDialog()
    window.show()
    sys.exit(app.exec_())

说明:

我们使用以下代码设置信号:

self.ui.ch_check.stateChanged.connect(self.state_changed)

当复选框的状态发生改变时,它会调用 state_changed 函数。这是你检查复选框是否被选中或未选中的逻辑所在。

def state_changed(self, int):
    if self.ui.ch_check.isChecked():
        self.ui.my_label.setText("CHECKED!")
    else:
        self.ui.my_label.setText("UNCHECKED!")
在该函数中,我们确定复选框是否被选中。如果是,则将标签更改为“CHECKED”,如果未选中,则标签更改为“UNCHECKED”。

示例:

当应用程序启动时,UI如下所示:

Newly opened app

选中复选框后,标签会更改:

Checked checkbox

取消选中复选框也会更改标签:

Unchecked checkbox


这正是我不想做的事情。我只想检查复选框的状态。仅此而已。为了更清晰,我更新了问题。 - MapEngine
在函数中使用if语句有什么问题?我没有理解你修改后的问题。 - Andy
你的回答很好,但不是我想要的。我的问题简单得多。我猜我把它说得过于复杂了,我只需要在我的if语句中添加**self.dlg.**就可以了,唉! - MapEngine
1
我有困难理解 def state_changed(self, int): 中的 int 参数来自何处,我们并没有向 self.state_changed 传递任何参数,那么为什么 int 应该作为一个参数在那里? - Sherafati
1
@Sherafati,需要使用int,因为复选框的信号stateChanged会发出一个整数。处理该信号的方法需要接受此参数。有关详细信息,请参见doc.qt.io - stephinity

2

如上方评论所述,我只是犯了一个小错误。正确的代码应该是:

def doCheck(self):
    checker = self.dlg.ch_check
    if self.dlg.ch_check.isChecked():
        self.dlg.le_text.setText("Hello")
    else:
        self.dlg.le_text.setText("Nope")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接