我有一个继承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();
}
那为什么它不起作用?
答案 0 :(得分:0)
您展示的代码是好的。我将它复制到Qt Creator的标准模板项目中。它运作正常。检查您的代理模型实施以及setRootIndex
来电的其他位置。