Qt-数据库开发-QTableView操作数据库(2)

Qt-数据库开发-QTableView操作数据库、自增Key

更多精彩内容
👉个人内容分类汇总 👈
👉数据库开发 👈

1、概述

  • 在开发数据库开发时我们常常需要设置一个Key,这个Key是唯一的,如果每次写入数据时需要我们自己去判断key是否重复,那就太麻烦了,所以可以设置自增key,由数据库内部去判断并设置key值。
  • 添加了非常详细的注释信息,对于小白更加友好。

开发环境说明

  • 系统:Windows10、Ubuntu20.04
  • Qt版本:V5.12.5
  • 编译器:MSVC2017-64、GCC/G++64

2、实现效果

  1. 这个Demo中展示了如何使用具有表视图的专用 SQL 表模型(QSqlTableModel)来编辑数据库中的信息,使用QTableView显示和编辑;
  2. 通过按键新建 空白数据行;
  3. 使用自增Key;
  4. 通过按键点击更新数据;
  5. 判断表是否存在,不存在则创建。
  • 实现效果如下:

    在这里插入图片描述

3、主要代码

  • 啥也不说了,直接上代码,一切有注释

  • pro文件: Qt使用到数据库,上来什么都别管,先在pro文件添加上QT += sql

  • widget.ui文件:添加3个button和1个QTableView
    在这里插入图片描述

  • widget.h文件

    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include <QWidget>
    #include <QSqlTableModel>
    #include <qsqlquery.h>
    
    QT_BEGIN_NAMESPACE
    namespace Ui { class Widget; }
    QT_END_NAMESPACE
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        Widget(QWidget *parent = nullptr);
        ~Widget();
    
    private slots:
        void initModel();
        bool isTableExists(const QString& table);
        void on_but_connect_clicked();
    
        void on_but_add_clicked();
    
        void on_but_read_clicked();
    
    private:
        Ui::Widget *ui;
        QSqlTableModel* m_model = nullptr;                                   // 创建一个 单个数据库表的可编辑数据模型
        QSqlDatabase m_db;
    };
    #endif // WIDGET_H
    
    
  • widget.cpp文件

    #include "widget.h"
    #include "ui_widget.h"
    
    #include <QMessageBox>
    #include <QSqlDatabase>
    #include <QDebug>
    
    Widget::Widget(QWidget *parent)
        : QWidget(parent)
        , ui(new Ui::Widget)
    {
        ui->setupUi(this);
        this->setWindowTitle(QString("QSql-使用QSqlTableModel显示数据库内容Demo2 - V%1").arg(APP_VERSION));
    }
    
    Widget::~Widget()
    {
        delete ui;
    }
    
    
    void Widget::on_but_connect_clicked()
    {
        if(ui->but_connect->text() == "关闭数据库")
        {
            ui->but_connect->setText("连接数据库");
    
            m_db.close();
    
        }
        else
        {
    
            m_db = QSqlDatabase::addDatabase("QSQLITE");  // 使用数据库驱动(Qsqlite)和默认连接名称(qt_sql_default_connection)添加一个数据库
            qDebug() << QSqlDatabase::defaultConnection;           // 打印默认数据库连接名称
        #if 1
            m_db.setDatabaseName("tableModel2.db");        // 使用文件数据库(可生成数据库文件,数据一直有效)
        #else
            m_db.setDatabaseName(":memory:");       // 使用内存数据库(不会生成数据库文件,所有数据都在内存中进行操作,性能强,程序退出后数据丢失)
        #endif
    
            if(!m_db.open())             // 打开数据库
            {
                QMessageBox::critical(nullptr, "Error", "打开数据库失败!");
                return ;
            }
    
            // 如果表不存在则创建表
            if(!isTableExists("person"))
            {
                QSqlQuery query;
    
                // 创建一个表person,包含id、firstname、lastname三个字段
                bool ret = query.exec("create table person ("
                           "id         integer primary key,"    // 索引(自增key),使用integer默认为自增, int不能设置主键自增
                           "firstname  varchar(20),"         // 名
                           "lastname   varchar(20))");       // 姓
                if(!ret)
                {
                    qDebug() << "创建表失败:";
                }
            }
    
            initModel();
    
            ui->but_connect->setText("关闭数据库");
        }
    }
    
    /**
     * @brief        判断表是否存在
     * @param table  表名称
     * @return       true存在 false不存在
     */
    bool Widget::isTableExists(const QString &table)
    {
        QSqlQuery query;
        QString sql = QString("select * from sqlite_master where name = '%1';").arg(table);  // 查询sqlite_master表中是否存在表名
        if(query.exec(sql))
        {
            return query.next();
        }
        return false;
    }
    
    /**
     * @brief SQL 表模型(QSqlTableModel)来编辑数据库中的信息
     */
    void Widget::initModel()
    {
        if(m_model)
        {
            m_model->clear();
            delete m_model;
            m_model = nullptr;
        }
        m_model = new QSqlTableModel(this, m_db);
        m_model->setTable("person");                                // 设置需要显示的数据库表
    #if 1
        m_model->setEditStrategy(QSqlTableModel::OnFieldChange);    // 在界面上修改后数据立刻保存到数据库
    #else
        m_model->setEditStrategy(QSqlTableModel::OnManualSubmit);   // 将将编辑数据库中值的策略设置为[在调用 submitAll() 或 revertAll() 之前,所有更改都将缓存在模型中(即在界面上修改数据后不会立刻存入数据库)]
    #endif
        m_model->setHeaderData(0, Qt::Horizontal, "ID");
        m_model->setHeaderData(1, Qt::Horizontal, "名称");
        m_model->setHeaderData(2, Qt::Horizontal, "姓氏");
        ui->tableView->setModel(m_model);
    }
    
    void Widget::on_but_add_clicked()
    {
        QSqlQuery query;
        query.prepare("insert into person(firstname, lastname)"       // 写入数据时不需写入id字段,实现自增
                      "values (:firstname, :lastname)");
        query.bindValue(":firstname", "");
        query.bindValue(":lastname", "");
        query.exec();
        m_model->select();                                           // 获取数据库中的数据
    }
    
    void Widget::on_but_read_clicked()
    {
        if(!m_model) return;
        m_model->select();                                         // 获取数据库中的数据
        ui->tableView->resizeColumnsToContents();                  // 根据表格中的内容自动调整列宽
    }
    
    

4、完整源代码

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mahuifa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值