如何解决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 举报,一经查实,本站将立刻删除。