繁体   English   中英

与排序模型一起使用时的Qt TreeView问题

[英]Qt TreeView problem when used with sort model

我有一个问题,到目前为止我还没有找到解决方案,实际上问题是什么时候以及对于什么QModelIndex我们必须调用beginInsertColumns和类似的函数。 我的示例是来自此处的标准Qt示例: http : //doc.qt.io/qt-5/qtwidgets-itemviews-editabletreemodel-example.html

它也随每个qt安装一起提供,例如C:\\ Qt \\ Qt5.12.0 \\ Examples \\ 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;
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM