QTree查看新行,没有布局就不可见已更改
QTreeView new row not visible without layoutChanged
我基于这个例子实现了一个分层的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
相关文章:
- 使用新行和不使用新行读取文件
- 遇到新行时,有没有办法停止istream_iterator
- PangoLayout 中忽略的新行
- 使用 clang 格式时,当行很大时,如何将右括号分成新行?
- 如何检测将文本文件读入 int 数组的新行
- 当 getline 直到新行才读取时会发生什么?
- 添加新行时工作代码引发异常.调试技巧?
- QTree查看新行,没有布局就不可见已更改
- 新行上的 clang 格式右括号
- C++流:保存到新行而不是覆盖旧行
- (C++) 使用诅咒打印从文件中读入的新行
- 按升序输出整数时,将最后一个整数放在新行上
- 用C++计算输入文本的新行数
- 为什么我的代码在终端中没有输出任何内容.开始新行没有错误
- WriteConsoleOutputCharacterW - 我的新行在哪里?
- 为什么当测试用例数为 1 时,我的程序不输入而是打印新行?
- 如何运行 while 循环直到到达新行?
- 从文本文件读取时,如何知道是否已到达新行?
- 句子转换器在存在新行的情况下不起作用
- 如何控制 clang 格式新行中 lessless 的对齐方式