Qt教程之QSqlQueryModel的使用詳解
1.功能概述
QSqlQueryModel是QSqlTableModel的父類。QSqlQueryModel封裝了執(zhí)行SELECT語句從數(shù)據(jù)庫查詢數(shù)據(jù)的功能,但是QSqlQueryModel只能作為只讀數(shù)據(jù)源使用,不可以編輯數(shù)據(jù)。
2.常用API
void clear() //清除數(shù)據(jù)模型,釋放所有獲得的數(shù)據(jù)
QSqlQuery query() //返回當(dāng)前關(guān)聯(lián)的QSqlQuery()對象
void setQuery() //設(shè)置一個QSqlQuery對象,獲取數(shù)據(jù)
QSqlRecord record() //返回一個空記錄,包含當(dāng)前查詢的字段信息
QSqlRecord record(int row) //返回行號為row的記錄
QSqlQueryModel作為數(shù)據(jù)模型從數(shù)據(jù)庫里查詢數(shù)據(jù),只需要使用setQuery()函數(shù)設(shè)置一個select查詢語句即可。
3.QSqlQuery
QSqlQuery是能執(zhí)行任意SQL語句的類,如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,"編號");
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);
//移動到首記錄
m_dataMapper->toFirst();
}
void Widget::on_btnOpen_clicked()
{
QString file = QFileDialog::getOpenFileName(this,"選擇數(shù)據(jù)庫文件","",
"SQLite數(shù)據(jù)庫(*.db *.db3)");
if(file.isEmpty())
return;
m_db = QSqlDatabase::addDatabase("QSQLITE");
m_db.setDatabaseName(file);
if(!m_db.open())
{
qDebug()<<"打開失敗";
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","蜀國");
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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vs2019 Com組件初探之簡單的COM編寫及實現(xiàn)跨語言調(diào)用的方法
這篇文章主要介紹了vs2019 Com組件初探之簡單的COM編寫及實現(xiàn)跨語言調(diào)用的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
C++可調(diào)用對象callable object深入分析
所謂的callable object,表示可以被某種方式調(diào)用其某些函數(shù)的對象。它可以是:一個函數(shù)、一個指向成員函數(shù)的指針、一個函數(shù)對象,該對象擁有operator()、一個lambda表達(dá)式,嚴(yán)格的說它是一種函數(shù)對象2022-08-08
淺談帶緩沖I/O 和不帶緩沖I/O的區(qū)別與聯(lián)系
下面小編就為大家?guī)硪黄獪\談帶緩沖I/O 和不帶緩沖I/O的區(qū)別與聯(lián)系。小編覺得挺不錯的現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01
C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
這篇文章主要介紹了C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法,涉及C語言針對數(shù)組的遍歷與判斷技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-07-07

