Qt | QSQLite内存数据库增删改查

01、演示

粉丝福利,费领取Qt开发学习资料包、技术视频,内容包括(Qt实战项目视频教程+代码,C++语言基础,C++设计模式,Qt编程入门,Qt信号与槽机制,Qt界面开发-图像绘制,Qt网络,Qt数据库编程,Qt项目实战教程,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

参数随便设置


查询

修改


右键菜单是重点


手动提交,点击Submit All


撤销更改,需要在提交前

02、QSqlTableModel

`QSqlTableModel` 是一个Qt SQL模块中的类,用于在视图中显示和编辑数据库表中的数据。它提供了一个方便的方式来处理数据库中的数据,而不需要编写复杂的SQL查询或数据库访问代码。通过`QSqlTableModel`,你可以直接将数据库表中的数据映射到Qt的模型/视图框架中,从而实现数据的显示和编辑。

在提供的代码示例中,`QSqlTableModel`被用来从名为`example.db`的SQLite数据库中的`my_table`表查询数据,并将查询结果显示在应用程序中。通过`model->select()`方法,模型会执行SQL查询并填充自身的数据。之后,你可以使用Qt的视图组件(如`QTableView`)来显示这些数据,并通过视图的接口来编辑数据。

03、QModelIndex

`QModelIndex` 是 Qt 中一个用于表示模型中特定项的索引的类。它是 `QAbstractItemModel` 类的子类,用于在模型/视图框架中定位数据。`QModelIndex` 提供了一组方法来获取节点的信息,如行号、列号和父节点索引。在 `QSqlTableModel` 的上下文中,`QModelIndex` 用于在视图和模型之间传递数据,以便正确显示和编辑数据库表中的数据。

04、QSqlDatabase

`QSqlDatabase` 是 Qt SQL 模块中的一个类,用于管理数据库连接。它提供了创建、打开、关闭数据库连接以及执行 SQL 查询等功能。通过 `QSqlDatabase`,你可以方便地与数据库进行交互,而无需直接编写底层的 SQL 代码。在提供的代码示例中,`QSqlDatabase` 被用来创建一个 SQLite 数据库连接,并指定了数据库文件的名称为 `example.db`。如果连接失败,程序会输出错误信息并返回错误代码。

05、QSqlQueryModel

QSqlQueryModel 是 Qt SQL 模块中的另一个类,用于执行 SQL 查询并在视图中显示结果。与 QSqlTableModel 不同,QSqlQueryModel 通常不用于编辑数据库中的数据。它主要用于检索数据并将其显示在 Qt 的模型/视图框架中。

在使用 QSqlQueryModel 时,你通常会创建一个 QSqlQuery 对象来执行 SQL 查询,然后将查询结果设置到 QSqlQueryModel 中。之后,你可以将 QSqlQueryModel 设置为某个视图的模型,以便在视图中显示查询结果。

06、QSqlError

QSqlError 是 Qt SQL 模块中的一个类,用于表示在执行 SQL 操作时发生的错误。它包含了错误的详细信息,如错误代码、错误描述以及错误发生的位置等。当 QSqlDatabase 类的方法(如 exec、query 等)遇到错误时,它们会创建一个 QSqlError 对象,并将其作为参数传递给相关的回调函数或信号。这样,开发者可以捕获这些错误,并采取适当的措施来处理它们。

07、.pro


# 定义项目模板为应用程序
TEMPLATE        = app

# 定义目标程序名称为sqlbrowser
TARGET          = sqlbrowser

# 添加Qt模块依赖,包括sql和widgets
QT              += sql widgets

# 需要Qt配置中包含tableview
requires(qtConfig(tableview))

# 定义头文件列表
HEADERS         = browser.h connectionwidget.h qsqlconnectiondialog.h

# 定义源文件列表
SOURCES         = main.cpp browser.cpp connectionwidget.cpp qsqlconnectiondialog.cpp

# 定义表单文件列表
FORMS           = browserwidget.ui qsqlconnectiondialog.ui

# 构建所有目标时,如果不是构建通过(build_pass),则设置配置为release
build_all:!build_pass {
    CONFIG -= build_all
    CONFIG += release
}


# install
target.path = $$[QT_INSTALL_EXAMPLES]/sql/sqlbrowser
INSTALLS += target

08、browser.h


#ifndef BROWSER_H
#define BROWSER_H

#include <QWidget>
#include <QSqlTableModel>
#include "ui_browserwidget.h"

class ConnectionWidget;
QT_FORWARD_DECLARE_CLASS(QTableView)
QT_FORWARD_DECLARE_CLASS(QPushButton)
QT_FORWARD_DECLARE_CLASS(QTextEdit)
QT_FORWARD_DECLARE_CLASS(QSqlError)

class Browser: public QWidget, private Ui::Browser
{
    Q_OBJECT
public:
    Browser(QWidget *parent = nullptr);
    virtual ~Browser();

    QSqlError addConnection(const QString &driver, const QString &dbName, const QString &host,
                  const QString &user, const QString &passwd, int port = -1);

    void insertRow();
    void deleteRow();
    void updateActions();

public slots:
    void exec();
    void showTable(const QString &table);
    void showMetaData(const QString &table);
    void addConnection();
    void currentChanged() { updateActions(); }
    void about();

    void on_insertRowAction_triggered()
    { insertRow(); }
    void on_deleteRowAction_triggered()
    { deleteRow(); }
    void on_fieldStrategyAction_triggered();
    void on_rowStrategyAction_triggered();
    void on_manualStrategyAction_triggered();
    void on_submitAction_triggered();
    void on_revertAction_triggered();
    void on_selectAction_triggered();
    void on_connectionWidget_tableActivated(const QString &table)
    { showTable(table); }
    void on_connectionWidget_metaDataRequested(const QString &table)
    { showMetaData(table); }
    void on_submitButton_clicked()
    {
        exec();
        sqlEdit->setFocus();
    }
    void on_clearButton_clicked()
    {
        sqlEdit->clear();
        sqlEdit->setFocus();
    }

signals:
    void statusMessage(const QString &message);
};

class CustomModel: public QSqlTableModel
{
    Q_OBJECT
public:
    explicit CustomModel(QObject *parent = nullptr, QSqlDatabase db = QSqlDatabase())
        : QSqlTableModel(parent, db) {}

    // 重写数据函数,用于自定义数据项的显示
    QVariant data(const QModelIndex &idx, int role) const override
    {
        // 如果角色是背景角色并且该项是脏的(即已被修改)
        if (role == Qt::BackgroundRole && this->isDirty(idx))
            // 返回黄色的背景刷
            return QBrush(QColor(Qt::yellow));
        // 否则,调用基类的data函数
        return QSqlTableModel::data(idx, role);
    }

};

#endif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值