首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QStandardItemModel::findItems不搜索QModelIndex(行、col、QModel(行、col))

QStandardItemModel::findItems不搜索QModelIndex(行、col、QModel(行、col))
EN

Stack Overflow用户
提问于 2019-03-14 11:19:10
回答 1查看 1.7K关注 0票数 1

我正在尝试从sql数据库创建层次树。树节点可以具有相同的名称,但唯一的ID。因此,我搜索节点父节点的ID,识别它的索引,并插入一个新的子行。

我还知道QModelIndexes是如何用QTreeView表示的。

例pic

但我被困在QStandardItemModel::findItems了。它只在QModelIndex(row, col)中搜索,但从不在QModelIndex(row, col, QModel(row,col))中搜索。

我想知道如何在层次树模型中找到第二列.

这是我的最低代码:main.cpp

代码语言:javascript
复制
#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();
}

我想要的是:

代码语言:javascript
复制
> 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

我有Qt 5.12.1,MSVC 2017 32位。

EN

回答 1

Stack Overflow用户

发布于 2019-04-10 08:09:29

您没有使用函数"StandardItemModel::findItems“的正确”第二个“参数。函数的默认扫描深度为1层。因此,如果您想要重新查找,应该使用参数"Qt::MatchRecursive".It:

代码语言:javascript
复制
modelname.findItems("xxxx",  Qt::MatchRecursive);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55161168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档