关于QSqlTableModel的使用说明(QT上创建本地SQL)
前言:通常我們操作數據庫時,需要使用sql語句;在qt開發環境中提供了QSqlTableModel類,它可以通過簡單的接口去操作數據庫,即使不熟悉sql語句也可以對數據庫進行大部分的操作,而且該模型還具有數據緩存功能,在修改數據后并不是立刻同步到數據庫中,允許用戶進行數據撤回,如果已經提交到數據庫的數據就不能進行撤回了;QSqlTableModel還有一個非常方便的操作就是它可以將數據庫的所有記錄顯示到QTableView控件上,并可以直接通過QTableView控件對數據庫任意位置的數據進行修改。下面就QSqlTableModel類的使用進行舉例說明。
Qt 5.14完整源碼下載,下載鏈接;源碼附帶詳細注釋,十分具有參考意義。
效果圖預覽:
1.創建本地數據庫
/*設置使用的數據庫驅動*/QSqlDatabase sqldb = QSqlDatabase::addDatabase("QSQLITE");/*打開指定文件下的數據庫文件,如果不存在則創建*/sqldb.setDatabaseName("./test.db");if(sqldb.open()){qDebug() <<"[test.db]數據庫打開成功。";}else{qDebug() <<"[test.db]數據庫打開失敗。";}本地數據庫可體現為一個文件,解讀這個文件需要特定的數據庫驅動,不同的數據庫類型需要對應的數據庫驅動。我上面采用的數據庫驅動是QSQLITE,可通過下面的命令查看當前環境支持的數據庫類型:
/*獲取當前環境支持哪些數據庫類型*/qDebug() <<"支持的數據庫類型:" <<QSqlDatabase::drivers();執行后的結果是:
支持的數據庫類型: ("QSQLITE", "QMYSQL", "QMYSQL3", "QODBC", "QODBC3", "QPSQL", "QPSQL7")使用QSqlQuery類執行sql語句,對數據庫插入一條記錄:?
/*用來執行sql語句的對象*/QSqlQuery query(sqldb);/*創建一個數據表*/query.exec(QObject::tr("create table student (id int primary key, name vchar ,age int)"));/*插入一條記錄*/query.exec(QObject::tr("insert into student values (0,'李小明',18)"));上面的語句在數據庫sqldb創建了一個名為student的數據表,數據表里面包含了三個字段id、name、age,類型分別為int、vchar、int。數據庫可以有多個數據表,數據表之間可有一對多的關系;數據表中的字段表示數據表中記錄的內容項,如一個學生的id、name、age。數據庫 > 數據表 > 記錄 > 字段。
使用QSqlTableModel類綁定數據庫,并將數據庫里的內容顯示在tableview控件上:
sqlmodel = new QSqlTableModel(this,sqldb);/*選擇一個數據庫里的其中一個數據表*/sqlmodel->setTable("student");/*設置修改tableview時是否立刻同步到數據庫文件里*/sqlmodel->setEditStrategy(QSqlTableModel::OnManualSubmit);//使用submitAll() or revertAll() 手動同步/*選取整個表的所有行*/sqlmodel->select();ui->tableView->setModel(sqlmodel);ui->tableView->setContextMenuPolicy(Qt::CustomContextMenu);實例化一個QSqlTableModel綁定了上面我們新建的數據庫sqldb,然后需要選擇數據庫里面其中一個數據表,如果數據表不存在則會返回失敗;使用sqlmodel->setEditStrategy可以設置編輯策略,修改是否立刻同步到數據庫文;ui->tableView->setModel(sqlmodel)之后數據庫sql里的數據表student所有的內容將在tableview上顯示出來。
2.使用QSqlTableModel類的接口對數據庫進行操作
1.新增記錄
/*在表的最后添加一行*/sqlmodel->insertRow(rowCnt);/*設置新行的第0列的值*/sqlmodel->setData(sqlmodel->index(rowCnt,0),id);rowCnt是所插入的行位置,id是新記錄字段"id"的值;setData還可以對已存在的數據項進行修改。
2.刪除記錄
/*獲取當前選中的行*/int curRow = ui->tableView->currentIndex().row();if( QMessageBox::critical(0 , tr("警告") ,tr("確認刪除?"),QMessageBox::Yes,QMessageBox::No, 0) == QMessageBox::Yes){sqlmodel->removeRow(curRow);}curRow是通過鼠標在tableview選中的行號,刪除操作時彈框再次確認是否刪除,確認后不會馬上消失在tableview里,在它的前面的序號會出現一個嘆號,如果點擊撤就會恢復這條記錄,如果點擊提交才會真正在數據庫里刪除這條記錄。
3.查詢記錄
if(!name.isEmpty() && id != -1){sqlmodel->setFilter(QObject::tr("name = '%1' id = '%2").arg(name).arg(id));}else if(!name.isEmpty()){sqlmodel->setFilter(QObject::tr("name = '%1'").arg(name));}else if(id != -1){sqlmodel->setFilter(QObject::tr("id = '%1'").arg(id));}sqlmodel->select(); //顯示結果可以同時進行名字name和id篩選,也可以單獨一個字段的篩選;相當于SQL語句的:SELECT * FROM student WHERE name = "名字"。
4.排序
void MainWindow::AscendingButton(void) {/*獲取當前選中列*/int curCol = ui->tableView->currentIndex().column();sqlmodel->setSort(curCol,Qt::AscendingOrder);/*顯示整個表的內容*/sqlmodel->select(); }void MainWindow::DescendingButton(void) {/*獲取當前選中列*/int curCol = ui->tableView->currentIndex().column();sqlmodel->setSort(curCol,Qt::DescendingOrder);/*顯示整個表的內容*/sqlmodel->select(); }curCol是鼠標當前選中的列,setSort需要兩個參數(列號,升序/降序)。
5.其他操作
model->submitAll();//提交修改 model->revertAll(); //撤銷修改 model->setEditStrategy(QSqlTableModel::OnManualSubmit);model->lastError();//獲取最后一次的錯誤信息OnManualSubmit表明需要submitAll()提交修改才能生效,沒有提交之前可以revertAll()撤銷修改,提交之后就不能進行撤銷了;在操作數據庫時,可能會出現條件不滿足導致操作失敗,我們可以通過lastError獲取錯誤信息,進行錯誤定位。
總結
以上是生活随笔為你收集整理的关于QSqlTableModel的使用说明(QT上创建本地SQL)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于QSerialPort的使用说明(Q
- 下一篇: SPC5Studio 入门