Qt 导入数据库sqlite的内容到tableview,嵌套QList容器

该代码段展示了如何从SQLite数据库中获取数据并填充到QTableView中。首先,通过QSqlQuery遍历数据库表格,将数据存储到QList容器中,然后逐行添加到外部列表。之后,这些数据被用来设置QStandardItemModel,用于驱动QTableView显示。同时提供了添加新行和删除选定行的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:将数据库需要的表格遍历一遍,把数据的每一行按位置来存入内层容器in_list(一次只能存一行),把数据再一行一行(每一行都是一个in_list)追加进外面的容器out_list。返回一个嵌套容器。

(注意:自带数据库sqlite,需要先连接具体的数据库,有的表格才能查出东西。连接数据库和建表放在文章最后了)

//显示监控区域配置的所有信息
QList<QList<QString> > Database::showRegion()
{
    QList<QString> in_list;   //内里容器,存放每一行
    QList<QList<QString> > out_list;    //外面容器存放所有的行

    QSqlQuery query;   //执行查询语句
    QString cmd = QString("select * from MonitoringArea;");
    query.exec(cmd);

    while(query.next())
    {   //区域名称 在总图上的坐标 平面图
        in_list.push_back(query.value(0).toString());
        in_list.push_back(query.value(1).toString());
        in_list.push_back(query.value(2).toString());

        out_list.append(in_list);   //数据按行添加
        in_list.clear();    //清空,方便下一行数据填充
    }

    return out_list;    //返回嵌套容器
}

思路:设置数据库的对象

Database *data;        //建议设置为全局变量
data = new Database

,让调用data->showRegion(),用容器接着。然后遍历容器,(*r_it)相当于in_list一行的数据,用at(n)按位置索引,每一行的数据传入设置item的函数,表格将一行一行填充。(注意:先设置表头,才能往表格写入东西)

//从数据库调数据,放入表格
void SystemConfigurationDialog::createTabview()
{
    //设置表头
    settingRegionHeader();    //设置区域表格,表头行数颜色等

    //设置表里的内容
    QList<QList<QString>> r_lst = data->showRegion();    //数据库获得嵌套容器
    int i = 0;
    //将数据库的信息一行一行读取出来
    for(QList<QList<QString>>::iterator r_it = r_lst.begin(); r_it != r_lst.end(); r_it++)
    {
        //插入数据到区域表格
        setRegionItemRow(i, (*r_it).at(0), (*r_it).at(1), (*r_it).at(2));
        i++;    //总行数
    }
}



//设置区域表格,表头行数颜色等
void SystemConfigurationDialog::settingRegionHeader()
{
    QStringList region_header;
    region_header << "区域名称" << "在总图上的坐标" << "平面图";

    // 准备数据模型
    modelRegion = new QStandardItemModel(this);
    modelRegion->setHorizontalHeaderLabels(region_header);  //添加表头
    modelRegion->setColumnCount(region_header.count());     //设置表格列数
    //区域位置的表格
    ui->tableView_region->setModel(modelRegion);      // 利用 setModel() 方法将数据模型与 QTableView 绑定

    
    //设置表头样式,可有可无
    ui->tableView_region->verticalHeader()->setVisible(false);  // 是否显示垂直表头
    ui->tableView_region->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);  // 均分填充表头采用
    ui->tableView_region->horizontalHeader()->setStyleSheet("QHeaderView::section"
                                                                "{background-color: rgb(152, 211, 255);}");  //设置表头颜色
    ui->tableView_region->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);   //表头内容居左

}




//插入数据到区域表格
void SystemConfigurationDialog::setRegionItemRow(int r_row, QString r_name, QString r_coordinate, QString r_plan)
{
    //为一行的单元格创建 Items
    QStandardItem *item;

    //区域名称
    item = new QStandardItem(r_name);
    item->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);    // 文本对齐格式,居左
    modelRegion->setItem(r_row, 0, item);

    //在总图上的坐标
    item = new QStandardItem(r_coordinate);
    item->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);    // 文本对齐格式,居左
    modelRegion->setItem(r_row, 1, item);

    //平面图
    item = new QStandardItem(r_plan);
    item->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);    // 文本对齐格式,居左
    modelRegion->setItem(r_row, 2, item);
}

按钮点击添加一行,和删除最后一次点击单元格所在行

//增加一个区域, 最后一行
void SystemConfigurationDialog::on_pushButton_region_add_clicked()
{

    setRegionItemRow(r_rowCount, "", "", "");    //增加的值全为空
    ui->tableView_region->scrollToBottom();     // 滚动到底部
    r_rowCount += 1;
}

//减少一个区域,所选单元格所在行
void SystemConfigurationDialog::on_pushButton_region_sub_clicked()
{
    auto index = ui->tableView_region->currentIndex();    //获取当前行号
    modelRegion->removeRow(index.row());    //删除行
    r_rowCount -= 1;
}

连接sqlite数据库和建表语法如下:

//在构造函数里面调用create_database()


#include <QDebug>
#include <QSettings>
#include <QSqlError>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QBuffer>

//创建数据库,连接数据库
void Database::create_database()
{
    QSqlDatabase db;

    //避免重复连接数据库
    if(QSqlDatabase::contains("qt_sql_default_connection"))
    {
        db = QSqlDatabase::database("qt_sql_default_connection");
    }
    else
    {
        db = QSqlDatabase::addDatabase("QSQLITE");
        db.setHostName("127.0.0");    //主机号
        db.setDatabaseName("FireSystem.db");  //设置数据库名称
        db.setUserName("user");
        db.setPassword("pwssword");
    }

    //判断数据库能否打开
    if(!db.open()){
        qDebug() << "database open error:" << db.lastError();;
    }
    else{
        qDebug() << "database ok!";
    }


    //创建表格UserInformation和MonitoringArea

    // 用户账号管理UserInformation
    QSqlQuery query(db);
    if(db.tables().contains("UserInformation"))
    {
        //qDebug() << "table UserInformation already exists!";
    }
    else
    {   
        //表格不存在,则创建表格
        //创建表格UserInformation,用户名userName,密码password ,权限/角色root
        QString cmd = "create table UserInformation(userName varchar(50) primary key, password varchar(50), root varchar(30));";

        if(!query.exec(cmd)){
            qDebug() << "create UserInformation table error!";
        }
    }

    //监控区域配置MonitoringArea
    if(db.tables().contains("MonitoringArea"))
    {
        //qDebug() << "table MonitoringArea already exists!";
    }
    else
    {
        //表格不存在,则创建表格MonitoringArea  区域名称areaName 在总图上的坐标areCoordinate 平面图plan
        if(!query.exec("create table MonitoringArea(areaName varchar(50) primary key, areCoordinate varchar(50), plan varchar(30))"))
        {
            qDebug() << "create MonitoringArea table error!";
        }
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值