1

Qt 4.8。我需要列表中的一些项目来拥有 3 个状态。所以我添加以下代码:

item = QtGui.QListWidgetItem("Hello there")
item.setFlags(QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsUserCheckable |
    QtCore.Qt.ItemIsTristate)
item.setCheckState(QtCore.Qt.PartiallyChecked)

项目在其创建时成功设置为部分选中状态,但进一步的鼠标点击会在选中/未选中状态之间切换。

4

2 回答 2

2

QtCore.Qt.ItemIsTristate已弃用,它被替换为ItemIsAutoTristate自动处理具有子项的项的部分检查状态。

从 Qt 5.5 开始,您可以使用QtCore.Qt.ItemIsUserTristate来拥有您想要的行为。

于 2016-09-05T13:30:46.573 回答
2

因为我们不能QListWidget在 Qt 4.8 中自动迭代 3 个状态(ItemIsUserTristate在 Qt 5.5 中添加了标志),我们将手动进行:

CHECKSTATE_ROLE = 32

def lstFiles_itemChanged(self, item):  # slot
    if item.flags() & QtCore.Qt.ItemIsTristate:
        if item.checkState() == QtCore.Qt.Checked and \
                        item.data(CHECKSTATE_ROLE) == QtCore.Qt.Unchecked:
            item.setCheckState(QtCore.Qt.PartiallyChecked)
        item.setData(CHECKSTATE_ROLE, item.checkState())

item = QtGui.QListWidgetItem("Buenas noches")
if this_item_needs_tristate:
    item.setFlags(item.flags() | QtCore.Qt.ItemIsTristate)
    state = QtCore.Qt.PartiallyChecked
else:
    state = QtCore.Qt.Checked
item.setCheckState(state)
item.setData(CHECKSTATE_ROLE, item.checkState())

一个项目会在用户数据元素中记住其先前的检查状态,因此我们可以在 上适当地更改状态itemChanged

于 2016-09-06T07:02:16.253 回答