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

时间:2016-09-05 12:56:33

标签: qt checkbox pyqt qlistwidget qlistwidgetitem

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)

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

2 个答案:

答案 0 :(得分:1)

不推荐使用

QtCore.Qt.ItemIsTristate,它被ItemIsAutoTristate取代,后者会自动处理包含子项的项目的部分检查状态。

从Qt 5.5起,您可以使用QtCore.Qt.ItemIsUserTristate来获得所需的行为。

答案 1 :(得分:1)

'因为我们无法让QListWidget在Qt 4.8中自动迭代3个状态(Qt 5.5中添加了ItemIsUserTristate标志),我们将手动完成:

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上相应更改状态。