Qt教程之QSqlQueryModel的使用詳解
1.功能概述
QSqlQueryModel是QSqlTableModel的父類。QSqlQueryModel封裝了執(zhí)行SELECT語(yǔ)句從數(shù)據(jù)庫(kù)查詢數(shù)據(jù)的功能,但是QSqlQueryModel只能作為只讀數(shù)據(jù)源使用,不可以編輯數(shù)據(jù)。
2.常用API
void clear() //清除數(shù)據(jù)模型,釋放所有獲得的數(shù)據(jù)
QSqlQuery query() //返回當(dāng)前關(guān)聯(lián)的QSqlQuery()對(duì)象
void setQuery() //設(shè)置一個(gè)QSqlQuery對(duì)象,獲取數(shù)據(jù)
QSqlRecord record() //返回一個(gè)空記錄,包含當(dāng)前查詢的字段信息
QSqlRecord record(int row) //返回行號(hào)為row的記錄
QSqlQueryModel作為數(shù)據(jù)模型從數(shù)據(jù)庫(kù)里查詢數(shù)據(jù),只需要使用setQuery()函數(shù)設(shè)置一個(gè)select查詢語(yǔ)句即可。
3.QSqlQuery
QSqlQuery是能執(zhí)行任意SQL語(yǔ)句的類,如select、insert、update、delete等。能和QSqlQueryModel一起聯(lián)合使用。
4.示例
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QSqlQueryModel> #include <QSqlQuery> #include <QSqlDatabase> #include <QDataWidgetMapper> #include "ComboBoxDelegate.h" #include "SpinBoxDelegate.h" #include <QModelIndex> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); private: void initTableView(); private slots: void on_btnOpen_clicked(); void on_tableView_clicked(const QModelIndex &index); void on_btnAdd_clicked(); void on_btnDel_clicked(); private: Ui::Widget *ui; private: QSqlQueryModel *m_model = nullptr; ComboBoxDelegate m_cbxDelegate; SpinBoxDelegate m_spinDelegate; QSqlDatabase m_db; QDataWidgetMapper *m_dataMapper = nullptr; }; #endif // WIDGET_H
#include "widget.h" #include "ui_widget.h" #include <QFileDialog> #include <QDebug> #include <QSqlRecord> Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); ui->tableView->verticalHeader()->setHidden(true); ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows); ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection); ui->tableView->setAlternatingRowColors(true); this->resize(1000,600); } Widget::~Widget() { delete ui; } void Widget::initTableView() { //數(shù)據(jù)表model m_model = new QSqlQueryModel(this); //查詢數(shù)據(jù) m_model->setQuery("select id,name,sex,age,addr,height from students"); m_model->setHeaderData(0,Qt::Horizontal,"編號(hào)"); m_model->setHeaderData(1,Qt::Horizontal,"姓名"); m_model->setHeaderData(2,Qt::Horizontal,"性別"); m_model->setHeaderData(3,Qt::Horizontal,"年齡"); m_model->setHeaderData(4,Qt::Horizontal,"地址"); m_model->setHeaderData(5,Qt::Horizontal,"身高"); //設(shè)置模型 ui->tableView->setModel(m_model); //設(shè)置性別代理 ui->tableView->setItemDelegateForColumn(2,&m_cbxDelegate); //設(shè)置年齡代理 ui->tableView->setItemDelegateForColumn(3,&m_spinDelegate); //創(chuàng)建界面組件與數(shù)據(jù)模型的字段之間的數(shù)據(jù)映射 m_dataMapper = new QDataWidgetMapper(this); //設(shè)置數(shù)據(jù)模型 m_dataMapper->setModel(m_model); m_dataMapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit); //界面組件與tabModel的具體字段之間的聯(lián)系 m_dataMapper->addMapping(ui->spinBoxNum,0); m_dataMapper->addMapping(ui->lineEditName,1); m_dataMapper->addMapping(ui->cbxSex,2); m_dataMapper->addMapping(ui->spinBoxAge,3); m_dataMapper->addMapping(ui->lineEditAddr,4); m_dataMapper->addMapping(ui->doubleSpinBoxHeight,5); //移動(dòng)到首記錄 m_dataMapper->toFirst(); } void Widget::on_btnOpen_clicked() { QString file = QFileDialog::getOpenFileName(this,"選擇數(shù)據(jù)庫(kù)文件","", "SQLite數(shù)據(jù)庫(kù)(*.db *.db3)"); if(file.isEmpty()) return; m_db = QSqlDatabase::addDatabase("QSQLITE"); m_db.setDatabaseName(file); if(!m_db.open()) { qDebug()<<"打開(kāi)失敗"; return; } initTableView(); } void Widget::on_tableView_clicked(const QModelIndex &index) { m_dataMapper->setCurrentIndex(index.row()); } void Widget::on_btnAdd_clicked() { QSqlQuery query; query.prepare("insert into students (id,name,sex,age,addr,height)" "values(:ID,:Name,:Sex,:Age,:Addr,:Height)"); query.bindValue(":ID",20); query.bindValue(":Name","馬超"); query.bindValue(":Sex","男"); query.bindValue(":Age",27); query.bindValue(":Addr","蜀國(guó)"); query.bindValue(":Height",1.76); if(!query.exec()) return; } void Widget::on_btnDel_clicked() { QModelIndex curIndex = ui->tableView->currentIndex(); //獲取當(dāng)前記錄 QSqlRecord curRec = m_model->record(curIndex.row()); if(curRec.isEmpty()) return; //獲取id int id = curRec.value("id").toInt(); QSqlQuery query; query.prepare("delete from students where id = :ID"); query.bindValue(":ID",id); if(!query.exec()) return; }
到此這篇關(guān)于Qt教程之QSqlQueryModel的使用詳解的文章就介紹到這了,更多相關(guān)Qt QSqlQueryModel內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解C++何時(shí)需要拷貝構(gòu)造函數(shù)
拷貝構(gòu)造函數(shù)是一個(gè)特殊的構(gòu)造函數(shù),用于創(chuàng)建一個(gè)新對(duì)象,該對(duì)象與另一個(gè)同類對(duì)象具有相同的屬性和值,在 C++ 中,拷貝構(gòu)造函數(shù)通常采用另一個(gè)同類對(duì)象作為參數(shù),并使用該對(duì)象初始化新對(duì)象,本文給大家講講何時(shí)需要拷貝函數(shù),需要的朋友可以參考下2023-09-09vs2019 Com組件初探之簡(jiǎn)單的COM編寫(xiě)及實(shí)現(xiàn)跨語(yǔ)言調(diào)用的方法
這篇文章主要介紹了vs2019 Com組件初探之簡(jiǎn)單的COM編寫(xiě)及實(shí)現(xiàn)跨語(yǔ)言調(diào)用的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12C++可調(diào)用對(duì)象callable object深入分析
所謂的callable object,表示可以被某種方式調(diào)用其某些函數(shù)的對(duì)象。它可以是:一個(gè)函數(shù)、一個(gè)指向成員函數(shù)的指針、一個(gè)函數(shù)對(duì)象,該對(duì)象擁有operator()、一個(gè)lambda表達(dá)式,嚴(yán)格的說(shuō)它是一種函數(shù)對(duì)象2022-08-08淺談帶緩沖I/O 和不帶緩沖I/O的區(qū)別與聯(lián)系
下面小編就為大家?guī)?lái)一篇淺談帶緩沖I/O 和不帶緩沖I/O的區(qū)別與聯(lián)系。小編覺(jué)得挺不錯(cuò)的現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
這篇文章主要介紹了C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法,涉及C語(yǔ)言針對(duì)數(shù)組的遍歷與判斷技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07