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、实现效果
- 这个Demo中展示了如何使用具有表视图的专用 SQL 表模型(QSqlTableModel)来编辑数据库中的信息,使用QTableView显示和编辑;
- 通过按键新建 空白数据行;
- 使用自增Key;
- 通过按键点击更新数据;
- 判断表是否存在,不存在则创建。
-
实现效果如下:
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(); // 根据表格中的内容自动调整列宽 }
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现