Qt6中QTreeWidget控件,显示树形数据(Sqlite)的方法

数据源和显示效果

 

思路

自定义一个容器:

QHash<int, QTreeWidgetItem *> *map = new QHash<int, QTreeWidgetItem *>;

key是节点的id

value是节点本身

先从数据库中按pid升序查询,遍历他.

如果pid为0,设置他的父节点为ui->treeWidget,后存入QHash容器

如果是其他,暂时不设置父节点,后存入QHash容器

数据库指针回到第一个,再遍历一次.

如果pid为0,不做处理.

使用id在QHash容器中返回节点本身.

使用pid在QHash容器中返回父节点.

父节点添加当前节点为子节点即可.

代码

#include "dialog.h"
#include <QDateTime>
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Dialog)
{
    ui->setupUi(this);
    QDateTime startTime = QDateTime::currentDateTime(); //开始计时
    ui->treeWidget->setHeaderLabel("单位全称");

    this->db = QSqlDatabase::addDatabase("QSQLITE");
    this->db.setDatabaseName("data.db");
    if (!db.open()) {
        // 连接失败的处理逻辑
        qDebug() << "连接失败";
        return;
    }
    QSqlQuery query;
    int id;
    int pid;
    QString name;
    QHash<int, QTreeWidgetItem *> *map = new QHash<int, QTreeWidgetItem *>;

    query.exec("SELECT * FROM dw_name ORDER BY pid;");
    while (query.next()) {
        id = query.value("id").toInt();
        pid = query.value("pid").toInt();
        name = query.value("name").toString();
        if (pid == 0) {
            QTreeWidgetItem *item = new QTreeWidgetItem(ui->treeWidget, QStringList() << name);
            map->insert(id, item);
        } else {
            QTreeWidgetItem *item = new QTreeWidgetItem(QStringList() << name);
            map->insert(id, item);
        }
    }
    query.first();
    while (query.next()) {
        id = query.value("id").toInt();
        pid = query.value("pid").toInt();
        name = query.value("name").toString();
        if (pid == 0) {
        } else {
            QTreeWidgetItem *child_item = map->value(id);
            QTreeWidgetItem *p_item = map->value(pid);
            p_item->addChild(child_item);
        }
    }

    QDateTime endTime = QDateTime::currentDateTime(); //结束计时
    qint64 elapsedMilliseconds = endTime.toMSecsSinceEpoch() - startTime.toMSecsSinceEpoch();
    QTime elapsedTime = QTime(0, 0, 0, elapsedMilliseconds);

    qDebug() << "Elapsed time:" << elapsedTime.toString("mm:ss.zzz");
    ui->treeWidget->expandAll();
}

Dialog::~Dialog()
{
    delete ui;
}

注意事项

数据库中按pid升序查询,一定要注意,一些节点因为pid数值大,可能会排在后面,所以这里一定不能按pid升序查询的结果,同时设置顶层节点和二层以下的父节点.

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Android,可以使用SQLite数据库来存储和管理数据。要显示SQLite数据数据,可以使用以下步骤: 1. 创建一个SQLiteOpenHelper类来管理数据库的创建和升级。 2. 在SQLiteOpenHelper类创建一个方法来查询数据数据,并返回一个Cursor对象。 3. 在Activity或Fragment,使用CursorAdapter来将Cursor数据显示在ListView或RecyclerView。 4. 可以使用Loader来异步加载数据,以避免在主线程执行查询操作。 5. 如果需要实现搜索功能,可以使用SearchView和Filter来过滤数据。 总之,要显示SQLite数据数据,需要创建一个SQLiteOpenHelper类来管理数据库,使用CursorAdapter将数据显示在UI组件,并使用Loader来异步加载数据。 ### 回答2: 在Android开发SQLite是一种轻量级数据库,它是Android系统的默认数据库,经常用于存储和管理数据。当我们需要在应用程序显示SQLite数据数据时,可以采用以下步骤: 1.创建数据库和表格 使用SQLiteOpenHelper类创建数据库,并在其创建所需的表格。表格通常可以包含多个列,每个列代表不同的数据类型。例如,我们可以在表格创建“姓名”列,类型为文本,并创建“年龄”列,类型为整数。 2.查询数据库 使用SQLiteDatabase类可以执行SQL查询,例如选择所有记录或根据条件选择特定记录。查询结果通常以Cursor对象的形式返回。 3.显示数据 用Cursor对象检索数据数据,并将数据绑定到视图以在应用程序显示。最常见的方法是创建一个ListView,并使用Adapter将数据绑定到ListView。在这种情况下,CursorAdapter是一种常用的适配器类型,可以将Cursor的数据自动绑定到ListView,从而实现快速和有效的数据显示。 总之,在Android开发,我们可以通过SQLiteOpenHelper、SQLiteDatabase和CursorAdapter等类轻松实现SQLite数据数据的检索和显示。这些类为我们提供了方便和高效的开发工具,使得我们能够轻松管理数据,并将其显示在应用程序的用户界面。 ### 回答3: 在Android平台SQLite是一种轻量级的关系型数据库,常用于存储应用程序的数据。在应用程序,如果需要读取或显示SQLite数据数据,需要掌握以下方法: 1. 定义SQLiteOpenHelper类 SQLiteOpenHelper是Android的一个抽象类,用于创建、升级和打开SQLite数据库。在应用程序,需要继承该类并实现onCreate()、onUpgrade()等方法。 2. 创建数据库表 在SQLite数据数据通过表来组织和存储。在应用程序,需要创建一个或多个表,定义表的结构和字段。 3. 执行SQL语句 SqliteDatabase是Android的一个类,用于执行SQL语句。通过该类,可以实现增删改查等操作。可以使用rawQuery()方法执行SQL查询语句,使用execSQL()方法执行SQL增删改语句。 4. 获取Cursor对象 在SQLite数据,SELECT语句查询的结果是一个Cursor对象,通过该对象可以遍历数据的所有数据。可以使用SqliteDatabase的query()方法查询数据库并返回Cursor对象。 5. 读取和显示数据 获取到Cursor对象后,可以使用moveToFirst()、moveToNext()等方法遍历每行数据。通过getString()、getInt()等方法获取特定字段的值,并将其显示在应用程序界面上。 总之,掌握以上几个步骤,就可以实现在Android应用程序显示SQLite数据数据。需要注意的是,具体的实现方法需要根据应用程序的需求和具体情况来进行调整和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值