【问题标题】:Auto update selection when a QStandardItem is disabled禁用 QStandardItem 时自动更新选择
【发布时间】:2016-06-30 08:44:52
【问题描述】:

我使用 Qt 5.6 和一个用 QStandardItem 填充的 QStandardItemModel 来显示一个数据表。

有些项目已启用,有些则未启用。

只能选择启用的项目(这是正常行为)。

但是当数据更新时,某些项目的启用状态可能会发生变化,这就是我的问题的根源。考虑以下场景:

1 an item is enabled
2 the user select it
3 the item is selected
4 the data are updated, the item is now disabled
5 the item remain selected, despite it is disabled

现在,用户可以与禁用的项目进行交互:打开上下文菜单,编辑它...

Qt 模型/视图框架中有一些“更新”方法,我可以调用这些方法在标志更改后更新所选状态吗?

或者对于我的所有项目视图,是否有任何简单(通用)的方法来解决这个问题? (不都是表格,不都是基于QStandardItem)

谢谢

【问题讨论】:

    标签: qt qabstractitemmodel qstandarditemmodel


    【解决方案1】:

    编辑:这似乎不起作用,因为 enabled 属性不是数据而是一个标志,编辑它不应触发命名信号。等一下!

    连接信号怎么样

    void QStandardItemModel:itemChanged(QStandardItem * item)
    

    使用一些帮助代码,例如

    void fixSelection(QStandardItem * item)
    {
        if (item.isEnabled()) {
            // remove item from selection model of view...
        }
    }
    

    有关QItemSelectionModel 的一些信息,另请参阅here

    如果数据被修改,您也可以考虑清除模型的整个选择。这将为您节省这些额外的工作量。我不知道哪个操作可能会禁用选择中的某些项目,以及哪个后续操作希望对先前进行的选择起作用。

    【讨论】:

    • 我想保留当前选择(对于仍然启用的项目),这就是问题所在!该数据会更改,但只会更改值,并且用户保留当前选择确实很有意义。
    • @Aurelien 那么 enabled 属性是否依赖于数据更改?那么上述解决方案可能仍然有效。否则,您必须自己切换 fixSelection 方法,这应该适合您。
    • 是的,启用的属性取决于数据的变化。我不能直接使用您的解决方案,原因有两个:1/ 有大量项目,性能受到影响 2/ 它不适用于基于非 QStandardItem 的模型。但我想我最终会得到一个类似的实现
    • @Aurelien To 1/ 如果更改的项目是被禁用的项目,那么性能影响应该很小,因为您已经拥有来自信号的项目。仅浏览所有选定的项目并找到它。如果选择很大,那么这个问题无论如何都是真实的。 2/你可以考虑void QAbstractItemModel::dataChanged
    猜你喜欢
    • 2019-03-17
    • 2019-12-19
    • 2016-11-20
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 2020-09-06
    • 2014-06-12
    • 1970-01-01
    相关资源
    最近更新 更多