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語(yǔ)言模擬實(shí)現(xiàn)qsort,strcpy,strcat,strcmp函數(shù)
這篇文章主要為大家詳細(xì)介紹了如何通過(guò)C語(yǔ)言模擬實(shí)現(xiàn)qsort(采用冒泡的方式),strcpy,strcat,strcmp等函數(shù),文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-11-11
C語(yǔ)言SetConsoleTextAttribute函數(shù)使用方法
這篇文章介紹了C語(yǔ)言SetConsoleTextAttribute函數(shù)的使用方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12
使用C語(yǔ)言實(shí)現(xiàn)內(nèi)存池的示例代碼
所謂內(nèi)存池,顧名思義和線程池的設(shè)計(jì)原理是一樣的,為了減少頻繁申請(qǐng)釋放內(nèi)存而帶來(lái)的資源消耗,減少釋放內(nèi)存后產(chǎn)生的內(nèi)存碎片,下面我們就來(lái)看看如何使用C語(yǔ)言實(shí)現(xiàn)內(nèi)存池吧2024-02-02
C++析構(gòu)函數(shù)內(nèi)部工作機(jī)制詳解
析構(gòu)函數(shù)(Destructor)也是一種特殊的成員函數(shù),沒(méi)有返回值,不需要程序員顯式調(diào)用(程序員也沒(méi)法顯式調(diào)用),而是在銷毀對(duì)象時(shí)自動(dòng)執(zhí)行。構(gòu)造函數(shù)的名字和類名相同,而析構(gòu)函數(shù)的名字是在類名前面加一個(gè)~符號(hào)2023-02-02

