使用QSortFilterProxyModel添加新行

时间:2017-06-21 07:11:33

标签: qt qtableview qsortfilterproxymodel

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

当用户点击"创建"按钮,在表中创建一个新的空行。如果我应用了过滤器,则不会出现空行,因为它不符合此过滤器,我不希望这样做,因为用户必须开始强制编辑其数据。

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

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

1 个答案:

答案 0 :(得分:0)

我会尝试以下方法:

  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内部,而不是简单地将空字符串插入模型中从模型中删除该项目。