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

问题描述:

我有一个树模型类继承QAbstractItemModel(比方说Model)和两个过滤代理模型继承QSortFilterProxyModel。这两种代理模式都在同一个模型实例设置:Qt模型/视图:代理模型上的setRootIndex失败

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

和这些过滤器是用户界面上的两个QTreeView S设定:

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(); 
} 

那么,为什么它不工作?

您显示的代码是好的。我将它复制到Qt Creator的标准模板项目中。它工作正常。请检查您的代理模型实施和setRootIndex调用的其他地方。