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