Qt模型/视图:代理模型上的setRootIndex失败

时间:2017-06-13 06:02:18

标签: qt

我有一个继承QAbstractItemModel的树模型类(让我们说Model)和两个继承QSortFilterProxyModel的过滤器代理模型。两个代理模型都设置在同一个模型实例上:

m_groupFilter->setSourceModel(m_model);
m_parameterFilter->setSourceModel(m_model);

并且这些过滤器在UI上的两个QTreeView上设置:

ui->treeViewGroups->setModel(m_groupFilter);
ui->treeViewParameters->setModel(m_parameterFilter);

现在,我想要第二个视图的setRootIndex(),从第一个视图到所选项目。连接信号等我这样做:

QModelIndex actualIndex = m_groupFilter->mapToSource(index);
QModelIndex mappedIndex = m_parameterFilter->mapFromSource(actualIndex);
qDebug() << mappedIndex.isValid();
qDebug() << ui->treeViewParameters->model();
qDebug() << mappedIndex.model();
ui->treeViewParameters->setRootIndex(mappedIndex);

上面的代码失败了,输出和警告:

true
ConfigurationParameterFilterModel(0x43d190)
ConfigurationParameterFilterModel(0x43d190)
QAbstractItemView::setRootIndex failed : index must be from the currently set model
QAbstractItemView::setRootIndex failed : index must be from the currently set model

我可以看到这只发生在setRootIndex的输入索引和调用setRootIndex的对象的模型不同(这里不是这种情况)或索引无效(这既不是这里的情况)。以下是Qt source code that generates the warning

void QAbstractItemView::setRootIndex(const QModelIndex &index)
{
    Q_D(QAbstractItemView);
    if (Q_UNLIKELY(index.isValid() && index.model() != d->model)) {
        qWarning("QAbstractItemView::setRootIndex failed : index must be from the currently set model");
        return;
    }
    d->root = index;
    d->doDelayedItemsLayout();
    d->updateGeometry();
}

那为什么它不起作用?

1 个答案:

答案 0 :(得分:0)

您展示的代码是好的。我将它复制到Qt Creator的标准模板项目中。它运作正常。检查您的代理模型实施以及setRootIndex来电的其他位置。