【问题标题】:Qt: How to autoexpand parents of a new QTreeView item when using a QSortFilterProxyModelQt:使用 QSortFilterProxyModel 时如何自动扩展新 QTreeView 项的父项
【发布时间】:2010-04-17 21:46:14
【问题描述】:

我正在制作一个应用程序,其中用户可以随时向 QTreeModel 添加新数据。它所在的父项会自动展开以显示新项目:

self.tree = DiceModel(headers)
self.treeView.setModel(self.tree)
expand_node = self.tree.addRoll()
#addRoll makes a node, adds it, and returns the (parent) note to be expanded
self.treeView.expand(expand_node)

这可以按需要工作。如果我将 QSortFilterProxyModel 添加到组合中:

self.tree = DiceModel(headers)
self.sort = DiceSort(self.tree)
self.treeView.setModel(self.sort)
expand_node = self.tree.addRoll()
#addRoll makes a node, adds it, and returns the (parent) note to be expanded
self.treeView.expand(expand_node)

父级不再扩展。知道我做错了什么吗?

【问题讨论】:

    标签: python qt pyqt pyqt4


    【解决方案1】:

    我相信您应该在调用 expand 之前将您的扩展项目索引映射到代理模型项目索引。 QSortFilterProxyModel::mapFromSource 方法应该可以满足您的需求。请检查下面的示例是否适合您(它是 c++,如果您在将其转换为 python 时遇到问题,请告诉我):

    // create models
    QStandardItemModel* model = new (QStandardItemModel);
    QSortFilterProxyModel* proxyModel = new QSortFilterProxyModel(this);
    proxyModel->setSourceModel(model);
    
    // set model
    ui->treeView->setModel(proxyModel);   
    ui->treeView->setSortingEnabled(true);
    
    // generate items
    QStandardItem* parentItem0 = model->invisibleRootItem();
    QModelIndex index = parentItem0->index();
    for (int i = 0; i < 4; ++i)
    {
        QStandardItem* item = new QStandardItem(QString("new item %0").arg(i));
        parentItem0->appendRow(item);
        parentItem0 = item;
    
        // expand items using proxyModel->mapFromSource 
        ui->treeView->expand(proxyModel->mapFromSource(item->index()));
        // line below doesn't work for you
        //ui->treeView->expand(item->index());
    }
    

    希望这会有所帮助,问候

    【讨论】:

      猜你喜欢
      • 2010-12-13
      • 1970-01-01
      • 2018-05-15
      • 1970-01-01
      • 2015-06-16
      • 1970-01-01
      • 2019-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多