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

Qt 通过鼠标单击部分检查QListWidget项(三态),qt,checkbox,pyqt,qlistwidget,qlistwidgetitem,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) 项目在创建时已成功设置为部分选中状

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)
项目在创建时已成功设置为部分选中状态,但再次单击鼠标将其在选中/未选中状态之间切换。

自Qt5.5以来,您可以使用QtCore.Qt.ItemIsUserTristate来获得所需的行为

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

自Qt5.5以来,您可以使用QtCore.Qt.ItemIsUserTristate来获得所需的行为

“由于我们无法使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上的状态。

由于我们无法使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上适当地更改状态。

Ok,这样ItemIsTristate就可以在QTreeWidget中工作。来自文档:如果检查了层次模型中的部分(但不是全部)子项,则可以部分检查这些子项。在这种情况下,它与QListWidget无关。很明显,为什么该标志被重命名为ItemIsAutoTristate。好的,那么ItemIsTristate在QTreeWidget中工作。来自文档:如果检查了层次模型中的部分(但不是全部)子项,则可以部分检查这些子项。在这种情况下,它与QListWidget无关。很明显,为什么国旗被重命名为ItemIsAutoTristate。