QListWidget:互斥复选框?

2024-09-30 02:17:56 发布

您现在位置:Python中文网/ 问答频道 /正文

QListWidget中QListWidgetItems的复选框是否可能相互排斥?也许用QButtongGroup之类的东西?我还没有找到任何东西

我有另一个想法,就是通过itemChanged侦听器将每个QListWidgetItem的checkstate设置为false,除了新选中的之外。但我不知道如何获取触发信号的项目


Tags: 项目false信号复选框侦听器qlistwidgetqlistwidgetitemcheckstate
2条回答

使用itemChanged是一种正确的方法,您可以仅从其参数中获取项

为了避免递归,您必须暂时断开信号与实际检查“独占性”的函数的连接,设置/取消设置检查状态,然后重新连接

class ExclusiveList(QtWidgets.QListWidget):
    def __init__(self):
        super().__init__()
        self.checkedRow = 0
        for i in range(10):
            item = QtWidgets.QListWidgetItem('Item {}'.format(i + 1))
            item.setCheckState(
                QtCore.Qt.Checked if i == self.checkedRow else QtCore.Qt.Unchecked)
            self.addItem(item)

        self.itemChanged.connect(self.checkExclusive)

    def checkExclusive(self, item):
        self.itemChanged.disconnect(self.checkExclusive)
        row = self.indexFromItem(item).row()
        if row != self.checkedRow:
            oldChecked = self.item(self.checkedRow)
            oldChecked.setCheckState(QtCore.Qt.Unchecked)
            self.checkedRow = row
        elif not item.checkState():
            # avoid unchecking the current checked item, so that one item will 
            # *always* be checked
            item.setCheckState(QtCore.Qt.Checked)
        self.itemChanged.connect(self.checkExclusive)

我现在使用的解决方案是一个QScrollArea,在QVBoxLayout中有一个qradiobutts列表。它的样式可能不像QListWidget,但它做了我需要它做的事情

以下是我正在使用的代码:

from PyQt5.QtWidgets import QApplication, QRadioButton, QButtonGroup, QScrollArea, QWidget, QVBoxLayout
import sys

class QRadioButtonListWidget(QScrollArea):

    def __init__(self, inputList, signalConnect=None, parent=None):
        super(QRadioButtonListWidget, self).__init__(parent)

        self.inputList = inputList
        self.signalConnect = signalConnect

        self.initUI()

        if not signalConnect is None:
            self.btnGroup.buttonClicked.connect(self.connector)

    def initUI(self):
        layout = QVBoxLayout()
        self.btnGroup = QButtonGroup()
        for i, elem in enumerate(self.inputList):
            btn = QRadioButton(str(elem))
            self.btnGroup.addButton(btn, i)
            layout.addWidget(btn)

        widget = QWidget()
        widget.setLayout(layout)
        self.setWidget(widget)

    def connector(self, btn):
        self.signalConnect(self.btnGroup.id(btn))


def printId(id):
    print("id clicked: " + str(id))

app = QApplication(sys.argv)
w = QRadioButtonListWidget([1, 2, 3, "A", "B", "C"], printId)
w.show()
app.exec_()

相关问题 更多 >

    热门问题