C/C++ Qt 数据库与TreeView组件绑定

2023-03-09 数据库SQLAndroidQt

在上一篇博文《c/c++ qt 数据库qsql增删改查组件应用》介绍了qt中如何使用sql操作函数,并实现了对数据库的增删改查等基本功能,从本篇开始将实现数据库与view组件的绑定,通过数据库与组件关联可实现动态展示数据库中的表记录。

我们先以treeview组件为例,简单介绍一下如何实现组件与数据的绑定,首先我们需要创建一个表并插入几条测试记录,运行如下代码实现建库建表.

#include <qsqldatabase>
#include <qsqlerror>
#include <qsqlquery>
#include <qsqlrecord>
#include <iostream>
#include <qstringlist>
#include <qstring>
#include <qvariant>

#include <qdatawidgetmapper>
#include <qtsql>

void init()
{
    qsqldatabase db = qsqldatabase::adddatabase("qsqlite");
    db.setdatabasename("./lyshark.db");
     if (!db.open())
     {
            std::cout << db.lasterror().text().tostdstring()<< std::endl;
            return;
     }

    // 执行sql创建表
    db.exec("drop table lyshark");
    db.exec("create table lyshark ("
                    "id integer primary key autoincrement, "
                    "name varchar(40) not null, "
                    "age integer not null)"
         );

    // 逐条插入
    db.exec("insert into lyshark(name,age) values('admin',22)");
    db.exec("insert into lyshark(name,age) values('lyshark',25)");
    db.exec("insert into lyshark(name,age) values('zhangsan',22)");
    db.exec("insert into lyshark(name,age) values('wangwu',22)");

    db.commit();
}

mainwindow::mainwindow(qwidget *parent) :qmainwindow(parent),ui(new ui::mainwindow)
{
    ui->setupui(this);
    init();
}

执行建库建表后,数据库内记录如下:

有了数据表以后,接着就需要将数据表中的记录与view组件进行绑定,绑定组件首先需要调用qsqlquerymodel查询数据表中的记录,当查询到记录以后,调用qitemselectionmodel()将该记录绑定到对应的模型中,最后调用ui->treeview->setmodel(qrymodel);以及ui->treeview->setselectionmodel(theselection);将该模型显示在treeview组件内,这段代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <qsqldatabase>
#include <qsqlerror>
#include <qsqlquery>
#include <qsqlrecord>
#include <iostream>
#include <qstringlist>
#include <qstring>
#include <qvariant>

#include <qdatawidgetmapper>
#include <qtsql>

#include <qstandarditem>
#include <qstringlist>
#include <qstringlistmodel>

// 定义数据模型指针
qsqlquerymodel *qrymodel;          // 数据模型
qitemselectionmodel *theselection; // 选择模型
qdatawidgetmapper *datamapper;     // 数据界面映射

mainwindow::mainwindow(qwidget *parent) :qmainwindow(parent),ui(new ui::mainwindow)
{
    ui->setupui(this);

    qsqldatabase db = qsqldatabase::adddatabase("qsqlite");
    db.setdatabasename("./lyshark.db");
     if (!db.open())
     {
            std::cout << db.lasterror().text().tostdstring()<< std::endl;
            return;
     }

     // 查询数据表中记录
     qrymodel=new qsqlquerymodel(this);
     qrymodel->setquery("select * from lyshark order by id");
     if (qrymodel->lasterror().isvalid())
     {
         return;
     }

     // 设置tableview表头数据
     qrymodel->setheaderdata(0,qt::horizontal,"id");
     qrymodel->setheaderdata(1,qt::horizontal,"name");
     qrymodel->setheaderdata(2,qt::horizontal,"age");

     // 将数据绑定到模型上
     theselection=new qitemselectionmodel(qrymodel);
     ui->treeview->setmodel(qrymodel);
     ui->treeview->setselectionmodel(theselection);
     ui->treeview->setselectionbehavior(qabstractitemview::selectrows);
}

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

运行代码后,程序会从数据库内取出结果并输出到treeview组件上:

上一篇:C/C++ Qt 数据库QSql增删改查组件应用

下一篇:C/C++ Qt 数据库与ComBox多级联动