Qt QSqlQueryModel详解

news2025/4/19 12:02:28

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.示例

 本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

#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开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/19684.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

投资有风险,入市需谨慎

投资有风险&#xff0c;入市需谨慎投资有风险&#xff0c;入市需谨慎股票的分类股票的分时图股票K线图股票交易规则股票趋势股票买卖机制投资有风险&#xff0c;入市需谨慎 感谢平台和大家支持&#xff0c;今天不聊技术&#xff0c;了解了解其他方面&#xff0c;比如股市&…

编程思维是一种什么思维?

hello wordl&#xff01;    keep coding&#xff01;&#x1f3c3; 学编程不是将来要当程序猿&#xff0c;而是在学习编程思维。比尔盖茨、扎克伯格、乔布斯用经验告诉我们&#xff0c;拥有编程思维的人&#xff0c;就相当于成功了一半——不但逻辑清晰心思缜密&#xff0c;…

vue + el-checkbox 单选功能

需求: 用 el-checkboc 实现单选功能并且当选中某一项时则回填到input框里,当点击 enter 键或者是 按下搜索图标按键,来实现页面搜索内容的同步展示;如图: <el-checkbox-group placeholder"请选择"size"small"v-model"checkedCols"clearablefi…

Android BLE HIDS Data ,从问询DB 到写入Android 节点的flow之二

问题点4&#xff1a;Android BLE具体连接flow 并问询DB的API flow 之第一阶段问询&#xff1b; 当前确认原生BT当作为GATT Client 连接上GATT Server时&#xff0c;在连接上后会有自动启动问询的动作(以下Tracing 基于Android 9(P), 测试 8.1的代码和Android 8.0有差异&#x…

Web大学生网页作业成品——抗击疫情网站设计与实现(HTML+CSS)实训素材

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 击疫情致敬逆行者感人类题材 | 致敬逆行者网页设计作品 | 大学生抗疫感动专题网页设计作业模板 | 等网站的设计与制作 | HTML期末大学生网页设计作业 …

第3阶段-运维线上实战-3.2企业级nginx使用

企业级nginx使用 nginx实现平滑升级 [rootlnmp nginx-1.16.0]# cd /usr/local/nginx/sbin/ [rootlnmp sbin]# ls nginx nginx.old [rootlnmp sbin]# ./nginx -v nginx version: nginx/1.16.0 [rootlnmp sbin]# ./nginx.old -v nginx version: nginx/1.14.2 [rootlnmp sbin]#操…

【Spring】Spring的AspectJ的AOP

Spring学习笔记(10)Spring的AspectJ的AOP 在Spring中使用AspectJ实现AOP AspectJ 是一个面向切面的框架&#xff0c; 它扩展了 Java 语言。 AspectJ 定义了 AOP 语法所以它有一个专门的编译器用来生成遵守 Java 字节编码规范的 Class 文件。AspectJ 是一个基于 Java 语言的 A…

[附源码]java毕业设计双学位在线考试系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

01-mysql基础

MySQL基础 今日目标&#xff1a; 完成MySQL的安装及登陆基本操作能通过SQL对数据库进行CRUD能通过SQL对表进行CRUD能通过SQL对数据进行CRUD 1&#xff0c;数据库相关概念 以前我们做系统&#xff0c;数据持久化的存储采用的是文件存储。存储到文件中可以达到系统关闭数据不会…

[附源码]SSM计算机毕业设计远程教育系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Springboot项目集成Swagger3.0

目录一&#xff0c;Swagger简介二&#xff0c;集成Swagger1&#xff0c;引依赖2&#xff0c;写配置3&#xff0c;配置说明3.1&#xff0c;暴露接口3.2&#xff0c;补充信息4&#xff0c;加注解注解说明三&#xff0c;测试一&#xff0c;Swagger简介 开发时经常会出现下面这种情…

【Redis从入门到进阶】第 1 讲:Redis的五大基本数据类型

本文已收录于专栏&#x1f345;《Redis从入门到进阶》&#x1f345;专栏前言 本专栏开启&#xff0c;目的在于帮助大家更好的掌握学习Redis&#xff0c;同时也是为了记录我自己学习Redis的过程&#xff0c;将会从基础的数据类型开始记录&#xff0c;直到一些更多的应用&#xf…

《十八》JS 中的错误处理

error 对象&#xff1a; error 对象是当错误发生时提供错误信息的 JS 内置对象。 当错误发生时&#xff0c;浏览器会生成 error 对象并抛出&#xff0c;并且中断后面代码的执行。 console.log(person.name) console.log(不会被执行到)也可以通过 Error() 构造函数自定义 err…

使用Resnet网络对人脸图像分类识别出男女性别(包含数据集制作+训练+测试)

文章目录前言一、数据预处理1.分类数据存放2.生成train.txt与val.txt二、更改配置文件1.自定义修改三、定义resnet网络四、train.py训练五、预测predict.py实现六、预测结果七、完整项目代码数据集(大于1500张)总结前言 本打算昨天写这篇博客的&#xff0c;推迟到今天晚上。实…

章节3 配置CentOS

3.1-什么是虚拟机 什么是虚拟机&#xff1f; Virtual Machine&#xff0c;虚拟软件/平台虚拟出来的操作系统。 虚拟机/物理机 虚拟化技术 虚拟化软件&#xff1a;VMware Workstation、VirtualBox、Virtual PC、Citrix Xen Desktop、Parallels Desktop&#xff08;MacOS&am…

刷题日记【第十五篇】-笔试必刷题【有假币+求正数数组的最小不可组成和+最难的问题+因子个数】

1.实例方法需要通过super来调用超类中的实例方法&#xff1b;实例方法需要通过类名称来调用超类的类方法&#xff1b;实例方法需要向下转型才能调用子类的实例方法&#xff1b;实例方法可以直接调用本类的实例方法。 2.HashSet子类依靠【hashCode();equals()】方法区分重复元素…

2.6 场效应管放大电路

一、场效应管放大电路的三种接法 场效应管的源极、栅极和漏极与晶体管的发射极、基极和集电极相对应&#xff0c;因此在组成放大电路时也有三种接法&#xff0c;即共源放大电路、共漏放大电路和共栅放大电路。以 NNN 沟道结型场效应管为例&#xff0c;三种接法的交流通路如图2…

Python 3.11 有什么新功能?

详细概述Python 3.11中最重要功能&#xff0c;包括如何安装 beta 版本以及何时可以获得官方稳定版本。 长按关注《Python学研大本营》&#xff0c;加入读者群&#xff0c;分享更多精彩 扫码关注《Python学研大本营》&#xff0c;加入读者群&#xff0c;分享更多精彩 Python在过…

【毕业设计】24-基于单片机的电子显示屏的设计与应用(原理图+源码+仿真工程+论文+答辩PPT)

【毕业设计】24-基于单片机的电子显示屏的设计与应用&#xff08;原理图源码仿真工程论文答辩PPT&#xff09; 文章目录资料下载链接任务书设计说明书摘要设计框架架构设计说明书及设计文件源码展示资料下载链接 资料下载链接 资料链接&#xff1a;https://www.cirmall.com/ci…

SpringBoot SpringBoot 开发实用篇 4 数据层解决方案 4.13 ES 下载与安装

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇4 数据层解决方案4.13 ES 下载与安装4.13.1 下载4.13.2 安装4.13.3 使…