如何在 QAbstractItemModel 和 QTreeView 类中找到子项?
Posted
技术标签:
【中文标题】如何在 QAbstractItemModel 和 QTreeView 类中找到子项?【英文标题】:HowTo find Subitem in QAbstractItemModel and QTreeView class? 【发布时间】:2010-07-20 13:59:51 【问题描述】:问题:如何在QTreeView
用model->match()
方法加载的QAbstractItemModel
模型中找到子项?
问题:model->match()
找不到子项目,wtf?!
示例如下:
从图片中可以看出,我正在尝试使用此代码扩展Layouts
子项:
void Dialog::restoreState(void)
// get list
QSettings settings("settings.ini", QSettings::IniFormat);
settings.beginGroup("MainWindow");
QStringList List = settings.value("ExpandedItems").toStringList();
settings.endGroup();
foreach (QString item, List)
if (item.contains('|'))
item = item.split('|').last();
// search `item` text in model
QModelIndexList Items = model->match(model->index(0, 0), Qt::DisplayRole, QVariant::fromValue(item));
if (!Items.isEmpty())
// Information: with this code, expands ONLY first level in QTreeView
view->setExpanded(Items.first(), true);
settings.ini
文件包含的位置:
[MainWindow]
ExpandedItems=Using Containers, Connection Editing Mode, Form Editing Mode, Form Editing Mode|Layouts
PS:根项目在启动时成功扩展!
【问题讨论】:
如果您使用自己的项目模型,您可以简单地重新实现匹配方法以满足您的需求(如文档所述) @Kamil Klimek 例如,我买了一辆汽车,如果汽车只有四个***,为什么还要安装第五个***?另一个问题,如果这种方法真的像文档所说的那样工作...... 好吧,因为 match 方法没有什么是递归的,我想它不是,因为它是在 QAbstractItemModel 中实现的,所以女巫对任何树(或其他)层次结构一无所知。这就是为什么如果你想让它递归,你必须重新实现 match 方法。 哦,根据你的“车”...好吧,最好有第五个(备用)***,以防万一你的另一个***变平.. 【参考方案1】:解决办法如下:
QModelIndexList Items = model->match(
model->index(0, 0),
Qt::DisplayRole,
QVariant::fromValue(item),
2, // look *
Qt::MatchRecursive); // look *
*
没有那个参数 match() 函数只搜索 1 级
【讨论】:
【参考方案2】:我在 QTreeView 上的工作示例。
QModelIndexList Indexes = this->ui->treeView->selectionModel()->selectedIndexes();
if(Indexes.count() > 0)
QStandardItemModel *am = (QStandardItemModel*)this->ui->treeView->model();
QStack<QModelIndex> mis;
QModelIndex mi = Indexes.at(0);
while(mi.isValid())
mis.push(mi);
mi = mi.parent();
QStandardItem *si;
bool FirstTime = true;
while (!mis.isEmpty())
mi = mis.pop();
if(FirstTime)
FirstTime = false;
si = am->item(mi.row());
else
si = si->child(mi.row());
// "si" - is selected item
【讨论】:
以上是关于如何在 QAbstractItemModel 和 QTreeView 类中找到子项?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用带有 Qabstractitemmodel 的 QSortFilterProxyModel 隐藏第一列
如何使用 QAbstractItemModel 从 QTreeView 中删除行?
以编程方式检查QAbstractItemModel / QTreeView中的项目
QAbstractItemModel:为啥在向模型中插入大量项目时发出 dataChanged 和插入行信号这么慢?