Qt数据库操作(三) -- 使用SQL模型类
文章目錄
- Qt數據庫操作(三) -- 使用SQL模型類
- 1、SQL查詢模型
- 2、SQL表格模型
- 3、關系表格模型
Qt數據庫操作(三) – 使用SQL模型類
Qt 提供了3個高級的類來訪問數據庫,分別是QSqlQueryModel、QSqlTable和QSqlRelationalTableModel。此三類都繼承自QAbstractableModel 派生來的。
使用這些類的好處是很容易地適應其他數據源。
1、SQL查詢模型
QSqlQueryModel 提供了一個基于SQL查詢的只讀模型。
QSqlQueryModel *model = new QSqlQueryModel(this);model->setQuery("select * from student"); model->setHeaderData(0, Qt::Horizontal, tr("學號")); model->setHeaderData(1, Qt::Horizontal, tr("姓名")); model->setHeaderData(2, Qt::Horizontal, tr("課程")); QTableView *view = new QTableView(this); view->setModel(model);這里首先創建了QSqlQueryModel 對象,然后使用setQuery()來執行SQL語句進行查詢整張student表。使用setHeaderData()來設置顯示的表頭。
然后創建視圖,將QSqlModel對象作為其要顯示的模型。
QSqlQueryModel中的其他操作:
colunmnCount() 返回一條記錄中字段的個數;
rowCount()返回結果集中記錄的條數;
record() 返回第n條記錄;
index()返回指定記錄指定字段的索引;
clear()可以清空模型中的結果集。
query()獲取QSqlQuery對象。
2、SQL表格模型
QSqlTableModel提供了一個一次只能操作一個SQL 表的讀、寫模型。
它是QSqlQuery的更高層次的替代品,可以瀏覽和修改獨立的SQL表。
如果想讓其成為只讀模型,那么可以從視圖進行設置,例如
view->setEditTrigers(QAbstractItemView::NoEditTriggers);
代碼示例:
model = new QSqlTableModel(this);model->setTable("student"); //指定數據表model->select(); //查詢等價于“select * from student”// 設置編輯策略model->setEditStrategy(QSqlTableModel::OnManualSubmit); // 設置表格模型的編輯策略ui->tableView->setModel(model); // 提交修改按鈕 void MainWindow::on_pushButton_clicked() {// 開始事務操作model->database().transaction();if (model->submitAll()) {model->database().commit(); //提交} else {model->database().rollback(); //回滾QMessageBox::warning(this, tr("tableModel"),tr("數據庫錯誤: %1").arg(model->lastError().text()));} }// 撤銷修改按鈕 void MainWindow::on_pushButton_2_clicked() {model->revertAll(); //將模型中的修改進行恢復 }// 查詢按鈕,進行篩選 void MainWindow::on_pushButton_7_clicked() {QString name = ui->lineEdit->text();//根據姓名進行篩選,一定要使用單引號model->setFilter(QString("name = '%1'").arg(name));model->select(); }// 顯示全表按鈕 void MainWindow::on_pushButton_8_clicked() {model->setTable("student");model->select(); }// 按id升序排列按鈕 void MainWindow::on_pushButton_5_clicked() {//id屬性,即第0列,升序排列model->setSort(0, Qt::AscendingOrder);model->select(); }// 按id降序排列按鈕 void MainWindow::on_pushButton_6_clicked() {model->setSort(0, Qt::DescendingOrder);model->select(); }// 刪除選中行按鈕 void MainWindow::on_pushButton_4_clicked() {// 獲取選中的行int curRow = ui->tableView->currentIndex().row();// 刪除該行model->removeRow(curRow);int ok = QMessageBox::warning(this,tr("刪除當前行!"),tr("你確定刪除當前行嗎?"),QMessageBox::Yes, QMessageBox::No);if(ok == QMessageBox::No){ // 如果不刪除,則撤銷model->revertAll();} else { // 否則提交,在數據庫中刪除該行model->submitAll();} }// 添加記錄按鈕 void MainWindow::on_pushButton_3_clicked() {// 獲得表的行數int rowNum = model->rowCount();int id = 10;// 添加一行model->insertRow(rowNum);model->setData(model->index(rowNum,0), id);// 可以直接提交//model->submitAll(); }3、關系表格模型
QSqlRelationTableModel繼承自QSqlTableModel,且對其進行了擴展,提供了對外鍵的支持。
QSqlRelationalTableModel *model = new QSqlRelationalTableModel(this);
model->setTable("student"); model->setRelation(2, QSqlRelation("course", "id", "name"));//在兩表之間創建一個關系,參數“2“表示student表中的編號為2的列,即第三個字段course是一個外鍵,它映射到了course 表中的id字段 model->select(); QTableView *view = new QTableView(this); view->setModel(model);view->setItemDelegate(new QSqlRelationalDelegate(view)); // 設置委托}
總結:
-
可以根據實際的需要選擇哪個模型。如果熟悉SQL語法,又不需要將所有的數據都顯示出來,只需要使用QSqlQuery就可以了。
-
QSqlTableModel,主要是用來顯示一個單獨的表格的。
-
QSqlQueryModel,可以顯示任意一個結果集。
-
關于 數據庫部分的應用,可以參考SQL分類下的幾個示例程序。
本文檔整理自《QtCreator快速入門》
總結
以上是生活随笔為你收集整理的Qt数据库操作(三) -- 使用SQL模型类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt 数据库操作(二)
- 下一篇: Qt5.15 连接MySQL数据库的实现