【问题标题】:Adding a new row with a QSortFilterProxyModel使用 QSortFilterProxyModel 添加新行
【发布时间】:2017-11-23 22:43:11
【问题描述】:

我有一个QTableView,它的数据模型是一个派生自我自己创建的QSortFilterProxyModel 的类。在这个类中,我们重新实现了方法filterAcceptsRow,以便能够根据几个标准过滤表的数据。我还可以按其中的任何字段对表格进行排序。

当用户单击“创建”按钮时会出现问题,这会在表中创建一个新的空行。如果我应用了过滤器,则不会出现空行,因为它不符合此过滤器,我不希望发生这种情况,因为用户必须开始强制编辑他们的数据。

另外,当我有一个按字段排序的表时,当我添加空行时,它会根据排序标准自动将自己定位在它播放的位置,这是不可取的,因为我希望它总是在第一个位置。

知道如何解决这个问题吗?

【问题讨论】:

  • 您可以使用QTableView::setSortingEnabled(false) 暂时禁用排序,然后再启用它。

标签: qt qtableview qsortfilterproxymodel


【解决方案1】:

我会尝试以下方法:

  1. 向模型添加另一列:“新项目”。该列将包含一个布尔标志,指示该项目是否是新的,即它刚刚被用户添加。由于此列纯粹用于内部目的,因此视图不会显示它,例如设置视图时,您需要为此列的视图调用setColumnHidden 方法。
  2. 使“创建”按钮将此列中的值设置为true,以便添加到模型中的新项目。
  3. 调整模型的sort 方法(覆盖QSortFilterProxyModel 的方法)以始终支持“新项目”标志设置为true 的项目,而不管其他排序标准。李>
  4. 为视图创建一个自定义委托(如果您还没有),它将继承 QStyledItemDelegate 并以一种非常简单的方式重新实现 setModelData 方法:

    void MyItemDelegate::setModelData(QWidget * editor, QAbstractItemModel * model, const QModelIndex & index)
    {
        QStyledItemDelegate::setModelData(editor, model, index);
    
        MyModel * myModel = qobject_cast<MyModel*>(model);
        myModel->clearNewFlagFromItem(index);
    }
    

    在这里,您让QStyledItemDelegate 将编辑器的数据插入模型中,但随后您立即将此项的“新项目”标志设置为false,从而表明用户已完成创建并从现在开始项目应使用常规排序标准进行排序。

    在理想情况下,您还应该考虑取消项目创建的可能性。例如,如果按下“创建”按钮并打开新行的编辑器,但用户没有输入任何内容并按 Enter,您应该认识到在委托的 setModelData 内,而不是将空字符串插入模型中,只需删除模型中的项目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    相关资源
    最近更新 更多