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)
使用
itemChanged
是一种正确的方法,您可以仅从其参数中获取项为了避免递归,您必须暂时断开信号与实际检查“独占性”的函数的连接,设置/取消设置检查状态,然后重新连接
我现在使用的解决方案是一个QScrollArea,在QVBoxLayout中有一个qradiobutts列表。它的样式可能不像QListWidget,但它做了我需要它做的事情
以下是我正在使用的代码:
相关问题 更多 >
编程相关推荐