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