通过鼠标单击部分检查 QListWidget 项目(三态)

Partially check QListWidget item by mouse click (tristate)

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)

项目在创建时已成功设置为 部分检查 状态,但进一步单击鼠标会在 已检查/[=15 之间切换=]未选中 状态。

QtCore.Qt.ItemIsTristate 已弃用,已被 ItemIsAutoTristate 取代,后者自动处理带有子项的项的部分检查状态。

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

'因为我们不能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 上适当地更改状态。