【Qt】数据库用户接口层
00. 目錄
文章目錄
- 00. 目錄
- 01. 概述
- 02. 開發環境
- 03. QSqlQueryModel類
- 04. QSqlTableModel類
- 05. QSqlRelationalTableModel類
- 06. QSqlRelationalDelegate類
- 07. 附錄
01. 概述
用戶接口層主要包括Qt SQL模塊中的QSqlQueryModel、QSqlTableModel、QSqlRelationalTableModel。用戶接口層的類實現了將數據庫中的數據鏈接到窗口部件上,是使用模型/視圖框架實現的,是更高層次的抽象,即便不熟悉SQL也可以操作數據庫。需要注意的是,在使用用戶接口層的類之前必須先實例化QCoreApplication對象。
QT中使用了自己的機制來避免使用SQL語句,提供了更簡單的數據庫操作及數據顯示模型,分別是只讀的QSqlQueryModel、操作單表的QSqlTableModel和支持外鍵的QSqlRelationalTableModel。
02. 開發環境
Windows系統:Windows10
Qt版本:Qt5.15或者Qt6
03. QSqlQueryModel類
3.1 QSqlQueryModel類簡介
QSqlQueryModel類為SQL結果集提供了只讀的數據模型,是執行SQL語句和遍歷結果集的高級接口。QSqlQueryModel基于下層的QSqlQuery構建,用于提供數據給QTableView等視圖類。
QSqlQueryModel模型默認是只讀的,通過QSqlQueryModel派生自定義類重寫setData()和flags()函數可以實現讀寫,或是使用QSqlTableModel。
3.2 QSqlQueryModel類常用成員函數
QSqlQueryModel(QObject *parent = nullptr)使用給定的parent創建一個空的QSqlQueryModel 。 virtual ~QSqlQueryModel()銷毀對象并釋放所有分配的資源。 virtual void clear()清除模型并釋放所有獲取的資源。 QSqlError lastError() const返回有關數據庫上發生的最后一個錯誤的信息。 QSqlQuery query() const返回與此模型關聯的QSqlQuery。 QSqlRecord record(int row) const返回包含有關當前查詢的字段信息的記錄。如果row是有效行的索引,則將使用該行中的值填充記錄。如果未初始化模型,則將返回空記錄。 QSqlRecord record() const返回一個空記錄,其中包含有關當前查詢的字段的信息。如果未初始化模型,則將返回空記錄。 void setQuery(const QSqlQuery &query)重置模型并將數據提供者設置為給定查詢。請注意,查詢必須處于活動狀態,并且不能為isForwardOnly()。 如果設置查詢時發生錯誤,lastError()可用于檢索詳細信息。 void setQuery(const QString &query, const QSqlDatabase &db = QSqlDatabase())對給定的數據庫連接db執行查詢查詢。如果未指定數據庫(或無效的數據庫),則使用默認連接。如果設置查詢時發生錯誤,lastError()可用于檢索詳細信息。virtual QModelIndex indexInQuery(const QModelIndex &item) const返回模型中給定項目的數據庫結果集中的值的索引。如果未插入,刪除或移動任何列或行,則返回值與item相同。如果item超出范圍或item沒有指向結果集中的值,則返回無效的模型索引。 virtual void queryChange()每當查詢更改時,都會調用此虛擬函數。默認實現不執行任何操作。 void setLastError(const QSqlError &error)該函數允許派生類將數據庫上發生的最后一個錯誤的值設置為error。程序示例一:
QSqlQueryModel *model = new QSqlQueryModel;model->setQuery("SELECT name, salary FROM employee");model->setHeaderData(0, Qt::Horizontal, tr("Name"));model->setHeaderData(1, Qt::Horizontal, tr("Salary"));QTableView *view = new QTableView;view->setModel(model);view->show();3.3 自定義QSqlQueryModel
? QSqlQueryModel默認是只讀的,在窗口上并不能對表格中的內容進行修改。如果要按照自己的需要顯示數據和修改數據,可以創建自己的模型。要想使其可讀
寫,需要自己的類繼承自QSqlQueryModel,并且重寫setData()和flags()兩個函數。如果要改變數據的顯示,就要重寫data() 函數。
Qt::ItemFlags flags(const QModelIndex &index) const; bool setData(const QModelIndex &index, const QVariant &value, int role); QVariant data(const QModelIndex &item, int role=Qt::DisplayRole) const;04. QSqlTableModel類
4.1 QSqlTableModel類簡介
QSqlTableModel提供了一個一次只能操作單個SQL表的讀寫模型,它是QSqlQuery的更高層次的替代品,可以瀏覽和修改獨立的SQL表,并且只需編寫很少的代碼,而且不需要了解SQL語法。
QSqlTableModel類為單個數據庫表提供了可編輯的數據模型,是從單個表中讀寫數據庫記錄的高級接口。QSqlTableModel基于下層的QSqlQuery構建,用于提供數據給QTableView等視圖類。
4.2 QSqlTableModel類常用成員方法
QSqlTableModel::QSqlTableModel(QObject *parent = Q_NULLPTR, QSqlDatabase db = QSqlDatabase()) 構建一個QSqlTableModel空對象,設置父對象為parent,數據庫連接為db,如果db非法,使用默認數據庫連接。[signal] void QSqlTableModel::beforeDelete(int row) [signal] void QSqlTableModel::beforeInsert(QSqlRecord &record) [signal] void QSqlTableModel::beforeUpdate(int row, QSqlRecord &record)QSqlDatabase QSqlTableModel::database() const 返回模型的數據庫連接[virtual protected] bool QSqlTableModel::deleteRowFromTable(int row) 從當前活躍的數據庫表中刪除給定的行EditStrategy QSqlTableModel::editStrategy() const 返回當前的編輯策略int QSqlTableModel::fieldIndex(const QString &fieldName) const 返回字段名為fieldName的字段的索引,如果沒有相應字段返回-1QString QSqlTableModel::filter() const 返回當前設置的過濾器bool QSqlTableModel::insertRecord(int row, const QSqlRecord &record) 在row行插入一條記錄record,如果row為負數,追加到尾部bool QSqlTableModel::isDirty(const QModelIndex &index) const 如果index位置的值是臟值,返回true。臟值是被模型修改單尚未寫入數據庫的值bool QSqlTableModel::isDirty() const 如果模型包含被修改的值并且沒有提交到數據庫,返回trueQSqlIndex QSqlTableModel::primaryKey() const 返回當前表的主鍵程序示例一:結合模型視圖顯示
QSqlTableModel *model = new QSqlTableModel;model->setTable("employee");model->setEditStrategy(QSqlTableModel::OnManualSubmit);model->select();model->setHeaderData(0, Qt::Horizontal, tr("Name"));model->setHeaderData(1, Qt::Horizontal, tr("Salary"));QTableView *view = new QTableView;view->setModel(model);view->hideColumn(0); // don't show the IDview->show();程序示例二:通過模型直接訪問數據
QSqlTableModel model;model.setTable("employee");model.select();int salary = model.record(4).value("salary").toInt();程序示例三:增刪改查
//查詢操作 QString name = lineedit->text(); //根據姓名進行篩選 model->setFilter(QString("name = '%1'").arg(name)); //顯示結果 model->select(); model->setTable("student"); //重新關聯表 model->select();//選擇整個表格//排序操作 //升序: model->setSort(0, Qt::AscendingOrder); //id屬性即第0列,升序排列 model->select();//降序: model->setSort(0, Qt::DescendingOrder); model->select();//刪除操作 //獲取選中的行 int curRow = view->currentIndex().row(); //刪除該行 model->removeRow(curRow); int ok = QMessageBox::warning(this,tr("刪除當前行!"),tr("你確定刪除當前行嗎?"),QMessageBox::Yes,QMessageBox::No); if(ok == QMessageBox::No) {model->revertAll(); //如果不刪除,則撤銷 } elsemodel->submitAll(); //否則提交,在數據庫中刪除該行//插入操作 int rowNum = model->rowCount(); //獲得表的行數 int id = 10; model->insertRow(rowNum); //添加一行 model->setData(model->index(rowNum,0),id);05. QSqlRelationalTableModel類
5.1 QSqlRelationalTableModel簡介
QSqlRelationalTableModel為了單個數據庫表格提供了可編輯的數據模型。
QSqlRelationalTableModel繼承自QSqlTableModel,并對其進行了擴展,提供了對外鍵的支持。外鍵就是一個表中的一個屬性和其他表中的主鍵屬性之間的一對一的映射。
5.2 QSqlRelationalTableModel常用成員方法
[virtual] void QSqlRelationalTableModel::setRelation(int column, const QSqlRelation &relation) 當前表中第column列為QSqlRelation(tableName,indexColumn,displayColumn)的外鍵QVariant QSqlRelationalTableModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const 返回index的數據[virtual protected] bool QSqlRelationalTableModel::insertRowIntoTable(const QSqlRecord &values) 向表中插入一條記錄valuesQSqlRelation QSqlRelationalTableModel::relation(int column) const 返回表格中第column列的關系[virtual] QSqlTableModel *QSqlRelationalTableModel::relationModel(int column) const 返回外鍵column要訪問的表的QSqlTableModel對象[virtual] bool QSqlRelationalTableModel::setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) 設置index數據項的值為value,數據項角色為role[virtual] void QSqlRelationalTableModel::setTable(const QString &table) 設置模型的表格為table程序示例:
model->setTable("employee");model->setRelation(2, QSqlRelation("city", "id", "name"));model->setRelation(3, QSqlRelation("country", "id", "name"));06. QSqlRelationalDelegate類
6.1 QSqlRelationalDelegate類簡介
為了控制表中某些數據項的數據的可選類型或是數據內容,可以使用委托。QT提供了QSqlRelationalDelegate委托類,可以為QSqlRelationalTableModel顯示和編輯數據。不同于默認的委托,QSqlRelationalDelegate為外鍵提供了字段的下拉框。
程序示例:
std::unique_ptr<QTableView> view{new QTableView};view->setModel(model);view->setItemDelegate(new QSqlRelationalDelegate(view.get()));07. 附錄
總結
以上是生活随笔為你收集整理的【Qt】数据库用户接口层的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Qt】数据库SQL接口层
- 下一篇: 【Qt】数据库实战(一)