QListWidget:互斥复选框?

如何解决QListWidget:互斥复选框?

QListWidget 中 QListWidgetItems 的复选框是否有可能互斥?也许像 QButtonGroup 这样的东西?我还没有找到任何东西。

我有一个想法,通过 itemChanged 侦听器将每个 QListWidgetItem 的 checkstate 设置为 false,但新检查的除外。但我不知道如何获得触发信号的项目。

解决方法

我现在使用的解决方案是在 QVBoxLayout 中带有 QRadioButton 列表的 QScrollArea。它的样式可能不像 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_()
,

使用 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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?