QT TreeView问题与排序模型一起使用



我有一个问题,我到目前为止找不到解决方案,实际上问题是我们必须调用beginInsertColumns和类似功能的QModelIndex何时何地。我的示例是这里的标准QT示例:http://doc.qt.io/qt-5/qtwidgets-itemviews-editabletreemodel-example.html

也随着每个QT安装的运输,例如c: qt qt5.12.0 示例 qt-5.12.0 widgets itemviews editabletreemodel

刚执行时,它可以正常工作,但是现在让我们插入一个QSortFilterProxyModel,只是为了使其可排序。我们将MainWindow C'tor更改为

...
QFile file(":/default.txt");
file.open(QIODevice::ReadOnly);
TreeModel *model = new TreeModel(headers, file.readAll());
file.close();
QSortFilterProxyModel* sort = new QSortFilterProxyModel( this );
sort->setSourceModel( model );
view->setModel( sort );
...

现在执行示例,展开一个或两个根节点,然后选择您会看到的菜单条目"插入列",只有根节点有一个新列,他们所有的孩子都没有新的列。它没有代理人。现在我的问题,我是否必须为每个有孩子的QModelIndex发射beginInsertColumns

我该如何解决?请注意,这不仅是QT 5.12的问题,而且还有许多较早的版本。

我一直使用QSortFilterProxymodel遇到问题,据我了解,它们通常与源模型之间的索引映射有关。

我设法使用QSortFilterProxymodel :: Invalidate()方法来解决它,该方法将重置映射,而不会破坏视图的当前状态。

修改MainWindow :: InsertColumn如下:

bool MainWindow::insertColumn()
{
    QAbstractItemModel *model = view->model();
    int column = view->selectionModel()->currentIndex().column();
    bool changed = false;
    // Insert a column in the parent item.
    QSortFilterProxyModel* sfpm = qobject_cast<QSortFilterProxyModel*>(model);
    if (sfpm)
    {
        changed = sfpm->insertColumn(column + 1);
        if (changed)
            sfpm->setHeaderData(column + 1, Qt::Horizontal, QVariant("[No header]"), Qt::EditRole);
        sfpm->invalidate();
    }
    updateActions();
    return changed;
}

这不是一个最佳解决方案,我不知道有更好的方法,但对我有用。

最新更新