QTree查看新行,没有布局就不可见已更改

QTreeView new row not visible without layoutChanged

本文关键字:布局 新行 QTree      更新时间:2023-10-16

我基于这个例子实现了一个分层的qtreeview:http://doc.qt.io/qt-5/qtwidgets-itemviews-simpletreemodel-example.html

我还使用QSortFilterProxyModel以及用于过滤的模型

我使用 addentry 函数构造树视图,每当模块收到新数据时都会调用该函数。函数给出如下:

void cTreeModel::addEntry(QModelIndex& sParentIndex, const tDataID id, cAbstractTreeItem *pParentItem)
{
switch (pParentItem->type()) {
case cAbstractTreeItem::TROOT:
{
cAbstractTreeItem* pAItem = pParentItem->hasEntry(id);
QModelIndex sAItemIndex;
if(nullptr == pAItem)
{
beginInsertRows(QModelIndex(), getRootItem()->childCount(), getRootItem()->childCount());
pAItem = new cATreeItem(id, pParentItem); //essentially m_pParentItem->appendChild(this);
endInsertRows();
}
else
{
pAItem->updateData();
}
sAItemIndex = index(pAItem->row());
addEntry(sAItemIndex, id, pAItem);
break;
}
case cAbstractTreeItem::TA
{
cAbstractTreeItem* pB = pParentItem->hasEntry(id);
if(nullptr == pB)
{
beginInsertRows(sParentIndex, pParentItem->childCount(), pParentItem->childCount());
pB = new cBTreeItem(id, pParentItem); //essentially m_pParentItem->appendChild(this);
endInsertRows();
}
else
{
pB->updateData();
}
QModelIndex sBItemIndex = index(pB->row(), 1, sParentIndex);
addEntry(sBItemIndex, id, pB);
break;
}
case cAbstractTreeItem::TB:
{
cAbstractTreeItem* pTC = pParentItem->hasEntry(id);
if(nullptr == pTC)
{
beginInsertRows(sParentIndex, pParentItem->childCount(), pParentItem->childCount());
pTC = new cCTreeItem(id, pParentItem); //essentially m_pParentItem->appendChild(this);
endInsertRows();
}
else
{
pTC->updateData();
}
QModelIndex sCItemIndex = index(pTC->row(), 2, sParentIndex);
addEntry(sCItemIndex, id, pTC);
break;
}
case cAbstractTreeItem::TC:
{
const tCanGUIData* pData = m_pDataHandler->getEntryByID(id);
if(nullptr == pData)
{
return;
}
break;
}
default:
break;
}
}

此函数的调用方式如下:

addEntry(QModelIndex(), DataId, getRootItem());

数据结构如下:

TA
|
| -- TB
| | | |
| | | | -- TC
| | | | -- TC

addentry 函数正确添加条目并发送数据更改信号,但树视图未更新。

但是如果我发出布局更改的信号,树视图会显示正确的数据。如果我在调用 addEntry 之前和之后调用 beginResetModel 和 EndResetModel,也会发生类似的情况。但是在这种情况下,会发生另一个错误,当调用addEntry的速率太大时,如果我使用箭头键更改选择,它会在mapToSource中崩溃(可能是在重置操作的中间,并且模型索引在代理过滤器中变得无效(

对此有什么建议吗?

您是否在插入新项目之前调用beginInsertRows(...(,并在之后调用endInsertRows(( ?

https://doc.qt.io/qt-5/qabstractitemmodel.html#beginInsertRows