Qt教程之QSqlQueryModel的使用详解

 更新时间:2022年11月21日 11:14:32   作者:音视频开发老舅  
QSqlQueryModel是QSqlTableModel的父类,它封装了执行SELECT语句从数据库查询数据的功能,本文将为大家介绍一下QSqlQueryModel的使用,需要的可以参考一下

1.功能概述

QSqlQueryModel是QSqlTableModel的父类。QSqlQueryModel封装了执行SELECT语句从数据库查询数据的功能,但是QSqlQueryModel只能作为只读数据源使用,不可以编辑数据。

2.常用API

void clear() //清除数据模型,释放所有获得的数据

QSqlQuery query() //返回当前关联的QSqlQuery()对象

void setQuery() //设置一个QSqlQuery对象,获取数据

QSqlRecord record() //返回一个空记录,包含当前查询的字段信息

QSqlRecord record(int row) //返回行号为row的记录

QSqlQueryModel作为数据模型从数据库里查询数据,只需要使用setQuery()函数设置一个select查询语句即可。

3.QSqlQuery

QSqlQuery是能执行任意SQL语句的类,如select、insert、update、delete等。能和QSqlQueryModel一起联合使用。

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()
{
    //数据表model
    m_model = new QSqlQueryModel(this);
 
    //查询数据
    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,"身高");
 
    //设置模型
    ui->tableView->setModel(m_model);
 
    //设置性别代理
    ui->tableView->setItemDelegateForColumn(2,&m_cbxDelegate);
 
    //设置年龄代理
    ui->tableView->setItemDelegateForColumn(3,&m_spinDelegate);
 
    //创建界面组件与数据模型的字段之间的数据映射
    m_dataMapper = new QDataWidgetMapper(this);
 
    //设置数据模型
    m_dataMapper->setModel(m_model);
 
    m_dataMapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit);
 
    //界面组件与tabModel的具体字段之间的联系
    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,"选择数据库文件","",
                                               "SQLite数据库(*.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();
 
    //获取当前记录
    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;
}

到此这篇关于Qt教程之QSqlQueryModel的使用详解的文章就介绍到这了,更多相关Qt QSqlQueryModel内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言实现斗地主的核心算法

    C语言实现斗地主的核心算法

    本文给大家分享的是使用C语言实现的斗地主游戏的核心算法,主要实现了面向对象设计,洗牌、发牌、判断牌型、比较牌的大小、游戏规则等算法。通过这个斗地主小项目的练习,提高了我的面向对象设计能力,加深了对算法的理解。最近把这些设计和算法分享给大家。
    2015-03-03
  • C语言如何改变字体颜色

    C语言如何改变字体颜色

    这篇文章主要介绍了C语言如何改变字体颜色,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • C++实现加减乘除计算器

    C++实现加减乘除计算器

    这篇文章主要为大家详细介绍了C++实现加减乘除计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下<BR>
    2022-01-01
  • 利用C语言模拟实现qsort,strcpy,strcat,strcmp函数

    利用C语言模拟实现qsort,strcpy,strcat,strcmp函数

    这篇文章主要为大家详细介绍了如何通过C语言模拟实现qsort(采用冒泡的方式),strcpy,strcat,strcmp等函数,文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-11-11
  • C指针原理教程之AT&T汇编

    C指针原理教程之AT&T汇编

    AT&T 汇编是一种和intel汇编在语法上完全不同的汇编语言,为避免混淆intel语法,本文只介绍AT&T汇编,AT&T的第一个特点就是每个寄存器名前必须加‘%’,立即数前必须加‘$’
    2019-02-02
  • C语言SetConsoleTextAttribute函数使用方法

    C语言SetConsoleTextAttribute函数使用方法

    这篇文章介绍了C语言SetConsoleTextAttribute函数的使用方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • 矩阵的行主序与列主序的分析

    矩阵的行主序与列主序的分析

    这篇文章主要介绍了矩阵的行主序与列主序的分析的相关资料,需要的朋友可以参考下
    2017-07-07
  • 使用C语言实现内存池的示例代码

    使用C语言实现内存池的示例代码

    所谓内存池,顾名思义和线程池的设计原理是一样的,为了减少频繁申请释放内存而带来的资源消耗,减少释放内存后产生的内存碎片,下面我们就来看看如何使用C语言实现内存池吧
    2024-02-02
  • C++析构函数内部工作机制详解

    C++析构函数内部工作机制详解

    析构函数(Destructor)也是一种特殊的成员函数,没有返回值,不需要程序员显式调用(程序员也没法显式调用),而是在销毁对象时自动执行。构造函数的名字和类名相同,而析构函数的名字是在类名前面加一个~符号
    2023-02-02
  • 使用C语言实现模糊搜索功能

    使用C语言实现模糊搜索功能

    本文所提到的模糊搜索是指输入不完整的关键词即可查询到对应的全部准确结果。下面小编通过实例代码给大家分享使用C语言实现模糊搜索功能,感兴趣的朋友一起看看吧
    2018-08-08

最新评论