【问题标题】:Partially check QListWidget item by mouse click (tristate)通过鼠标单击部分检查 QListWidget 项(三态)
【发布时间】:2017-01-12 20:31:34
【问题描述】:

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 checkbox pyqt qlistwidget qlistwidgetitem


    【解决方案1】:

    QtCore.Qt.ItemIsTristate 已弃用,取而代之的是ItemIsAutoTristate,它会自动处理带有子项的项的部分检查状态。

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

    【讨论】:

    • 好的,所以ItemIsTristateQTreeWidget 中工作。来自文档:Items in hierarchical models may be partially checked if some, but not all, of their children are checked. 在这种情况下,它与QListWidget 无关。很明显为什么标志被重命名为ItemIsAutoTristate
    【解决方案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 上适当地更改状态。

    【讨论】:

      猜你喜欢
      • 2011-05-04
      • 1970-01-01
      • 1970-01-01
      • 2014-07-18
      • 2011-08-10
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多