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