[英]QStandardItemModel::findItems does not search in QModelIndex(row, col, QModel(row,col))
I'm trying to create hierarchical tree from sql database. 我正在尝试从sql数据库创建层次树。 Tree nodes can have the same name, but unique ID.
树节点可以具有相同的名称,但是具有唯一的ID。 Therefore I search for a node parent by its ID, recognize its index and insert a new child row.
因此,我通过其ID搜索父节点,识别其索引并插入新的子行。
Also I know how QModelIndex
es are represented in QTreeView
. 我也知道
QModelIndex
是如何在QTreeView
中表示的。
Example pic 图片示例
But I'm stuck in QStandardItemModel::findItems
. 但是我陷在
QStandardItemModel::findItems
。 It searches only in QModelIndex(row, col)
, but never in QModelIndex(row, col, QModel(row,col))
. 它仅在
QModelIndex(row, col)
,而不在QModelIndex(row, col, QModel(row,col))
。
I would appreciate any advice how to find second column in hierarchical tree model. 我将不胜感激如何在分层树模型中找到第二列的任何建议。
Here is my minimum code: main.cpp
这是我的最小代码:
main.cpp
#include <QApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QTreeView>
#include <QStandardItemModel>
void createDB()
{
QSqlDatabase m_db = QSqlDatabase::addDatabase("QSQLITE");
m_db.setDatabaseName(":memory:");
if (!m_db.open()) {
return;
}
QSqlQuery query;
query.exec("CREATE TABLE IF NOT EXISTS tags ("
"id INTEGER PRIMARY KEY AUTOINCREMENT,"
"parent_id INTEGER DEFAULT -1 REFERENCES tags(id),"
"title TEXT NOT NULL);");
query.exec("INSERT INTO tags(title) VALUES('item 1');");
query.exec("INSERT INTO tags(title) VALUES('item 2');");
query.exec("INSERT INTO tags(parent_id, title) VALUES(1, 'sub 1');");
query.exec("INSERT INTO tags(parent_id, title) VALUES(2, 'sub 1');");
query.exec("INSERT INTO tags(parent_id, title) VALUES(2, 'sub 2');");
query.exec("INSERT INTO tags(parent_id, title) VALUES(3, 'sub sub 1');");
query.exec("INSERT INTO tags(parent_id, title) VALUES(3, 'sub sub 2');");
}
void createTreeView() {
QTreeView *m_view = new QTreeView;
QStandardItemModel *m_model = new QStandardItemModel;
m_model->setColumnCount(2);
m_view->setModel(m_model);
QSqlQuery query("SELECT id, parent_id, title FROM tags;");
while (query.next()) {
QList<QStandardItem *> node;
node << new QStandardItem(query.value("title").toString());
node << new QStandardItem(query.value("id").toString());
if (query.value("parent_id").toInt() == -1) {
m_model->appendRow(node);
} else {
QList<QStandardItem *> items = m_model->findItems(query.value("parent_id").toString(), Qt::MatchExactly | Qt::MatchRecursive, 1);
for (QStandardItem *item : items) {
QModelIndex index = item->index().siblingAtColumn(0);
item = m_model->itemFromIndex(index);
item->appendRow(node);
}
}
}
m_view->expandAll();
m_view->resizeColumnToContents(0);
//m_view->hideColumn(1);
m_model->setHeaderData(0, Qt::Horizontal, QVariant());
m_view->show();
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
createDB();
createTreeView();
return a.exec();
}
What I want to get: 我想得到什么:
> item 1
> sub 1
sub sub 1 // does not appear, because `findItems` returns an empty list.
sub sub 2 // same
> item 2
sub 1
sub 2
I have Qt 5.12.1, MSVC 2017 32bit. 我有Qt 5.12.1,MSVC 2017 32位。
You didn't use the correct "second" parameter of the function "StandardItemModel::findItems". 您没有使用函数“ StandardItemModel :: findItems”的正确“第二”参数。 The default scan depth of the function is 1 layer.
该功能的默认扫描深度为1层。 So, if you want to seek recusively, you should use the parameter "Qt::MatchRecursive".It like:
因此,如果您想进行消退性搜索,则应使用参数“ Qt :: MatchRecursive”。它类似于:
modelname.findItems("xxxx", Qt::MatchRecursive);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.