当前位置: 首页 > news >正文

QT 使用QTableView读取数据库数据,表格分页,跳转,导出,过滤功能

文章目录

      • 效果图
      • 概述
      • 功能点
      • 代码分析
        • 导航栏
        • 表格更新视图
        • 表格导出
        • 表格过滤
      • 总结

效果图

概述

  • 本案例用于对数据库中的数据进行显示等其他操作。数据库的映射,插入等功能看此博客
  • 框架:数据模型使用QSqlTableModel,视图使用QTableView,表格的一些字体或者控件之类的使用QStyledItemDelegate实现。
    导航栏的变化实时的传回给表格,所有的数据库表都实现继承一个表格类,根据表格本身的特性可以设置自己的委托。数据库使用一个单列类进行管理,包括数据库的读取 ,创建,数据插入,以及对模型的映射等。

功能点

  1. 自选每页显示行数
  2. 跳转指定页面
  3. 上下翻页,最后/最前一页跳转
  4. 表格导出
  5. 表格查询

代码分析

导航栏
  • 该部分不复杂主要和tableView进行联动
    void PageNavigator::SetCurrentPage(int page)
    {if (m_curPage == page){return;}if (page < 1){page = 1;}if (page > (int)m_maxPage){page = m_maxPage;}m_curPage = page;ui->labelCurPage->setText(QString("第%1页/共%2页").arg(m_curPage).arg(m_maxPage));UpdateButtonState();emit SigCurrentPageChanged(m_curPage); // 通知 table 刷新
    }
    
表格更新视图
  • 每次使用过滤时要格外注意语句的条件
    void QTablePages::updateTableView()
    {if (!m_dataModel)return;if (m_filter != QString()) // 有过滤条件的情况{int offset = (m_currentPage - 1) * m_pageLines;// 使用正则表达式来匹配LIMIT和OFFSET后面的数字QRegExp limitRegex("LIMIT\\s*(\\d+)");QRegExp offsetRegex("OFFSET\\s*(\\d+)");// 替换LIMITm_filter.replace(limitRegex, QString("LIMIT %1").arg(m_pageLines));// 替换OFFSETm_filter.replace(offsetRegex, QString("OFFSET %1").arg(offset));m_dataModel->setFilter(m_filter);m_dataModel->select();return;}int offset = (m_currentPage - 1) * m_pageLines; // 计算偏移量 要减1,因为从0开始m_dataModel->setFilter(QString("1=1 ORDER BY time DESC LIMIT %1 OFFSET %2").arg(m_pageLines).arg(offset));m_dataModel->select();
    }
    
表格导出
  • 简单的导出为csv格式,要是为excel格式,则需要引入excel的库
void QTablePages::exportToCSV()
{if (!m_dataModel)return;QFileDialog dialog(this);dialog.setOptions(QFileDialog::DontUseNativeDialog);dialog.setWindowTitle(tr("表格导出"));dialog.setAcceptMode(QFileDialog::AcceptSave);dialog.setNameFilter(tr("CSV Files (*.csv)"));dialog.setStyleSheet("color: white;");QString saveFileName;if (dialog.exec()){saveFileName = dialog.selectedFiles().first();QFileInfo fileInfo(saveFileName);if (fileInfo.suffix().toLower() != "csv"){saveFileName += ".csv"; // 如果用户没有输入.csv,则添加它}}// 如果用户取消了操作,则返回if (saveFileName.isEmpty())return;// 打开一个文件用于写入QFile file(saveFileName);if (!file.open(QIODevice::WriteOnly | QIODevice::Text)){// 处理错误return;}/// 重置过滤条件-查询所有数据int offset = getOffest();int totalPages = getTotalPages();QString filter = getFilter();m_dataModel->setFilter(QString("1=1"));m_dataModel->select();QTextStream out(&file);int columnCount = m_dataModel->columnCount() - 1;// 写入列标题 操作列不写入for (int i = 1; i < columnCount; i++){out << m_dataModel->headerData(i, Qt::Horizontal).toString();if (i < columnCount - 1)out << ",";}out << "\n";// 写入数据auto formatDateTime = [](const QDateTime &dateTime){return dateTime.toString("yyyy-MM-dd HH:mm:ss");};for (int i = 0; i < m_dataModel->rowCount(); i++){QSqlRecord record = m_dataModel->record(i);for (int j = 1; j < columnCount; j++){QSqlField field = record.field(j);if (field.type() == QVariant::DateTime){// 如果字段是日期时间类型,则格式化输出QDateTime dateTime = field.value().toDateTime();out << formatDateTime(dateTime);}else{// 其他字段按原样输出out << field.value().toString();}if (j < columnCount - 1)out << ",";}out << "\n";}// 关闭文件file.close();// 恢复过滤条件if (filter != QString()){m_dataModel->setFilter(filter);}else{m_dataModel->setFilter(QString("1=1 ORDER BY time DESC LIMIT %1 OFFSET %2").arg(totalPages).arg(offset));}m_dataModel->select();
}
表格过滤
  • 数据过滤的条件,要和导航栏的偏移分开获取,不然过滤会出现问题
void QTablePages::refreshData(const QString &dateFrom, const QString &dateTo, const QString &content)
{if (m_dataModel == nullptr)return;QString filter;// 获取日期范围QString dateFilter = "time BETWEEN '" + dateFrom + "' AND '" + dateTo + "'";// 获取内容过滤条件QString contentFilter;if (!content.isEmpty()){contentFilter = "content LIKE '%" + content + "%'";}// 构建最终的过滤条件if (!filter.isEmpty()){if (!dateFilter.isEmpty()){filter += " AND " + dateFilter;}if (!contentFilter.isEmpty()){filter += " AND " + contentFilter;}}else{if (!dateFilter.isEmpty()){filter = dateFilter;if (!contentFilter.isEmpty()){filter += " AND " + contentFilter;}}else if (!contentFilter.isEmpty()){filter = contentFilter;}}// 重置导航条数据m_dataModel->setFilter(filter);m_dataModel->select();m_pageNavBar->updateNavbar(m_dataModel->rowCount(), m_pageLines);// 计算偏移量,要减1,因为从0开始int offset = (m_currentPage - 1) * m_pageLines;// 添加排序、限制和偏移量到过滤条件if (!filter.isEmpty()){filter += " ORDER BY time DESC LIMIT " + QString::number(m_pageLines) + " OFFSET " + QString::number(offset);}else{filter = "1=1 ORDER BY time DESC LIMIT " + QString::number(m_pageLines) + " OFFSET " + QString::number(offset);}m_filter = filter;// 应用最终的过滤条件m_dataModel->setFilter(filter);m_dataModel->select();
}

总结

  • 知识理应共享,源码在此
  • 导航栏,表格这些功能基本上都是单独封装好的,可以直接拿来用的

相关文章:

QT 使用QTableView读取数据库数据,表格分页,跳转,导出,过滤功能

文章目录 效果图概述功能点代码分析导航栏表格更新视图表格导出表格过滤 总结 效果图 概述 本案例用于对数据库中的数据进行显示等其他操作。数据库的映射&#xff0c;插入等功能看此博客框架&#xff1a;数据模型使用QSqlTableModel&#xff0c;视图使用QTableView&#xff0…...

【前端】CSS学习笔记(1)

目录 CSS的简介CSS的概念语法 CSS的引入方式内联样式&#xff08;行内样式&#xff09;内部样式外部样式&#xff08;推荐&#xff09; 选择器全局选择器元素选择器类选择器ID选择器合并选择器后代选择器子选择器相邻兄弟选择器通用兄弟选择器伪类选择器:link:visited:hover:ac…...

Ubuntu离线docker compose安装DataEase 2.10.4版本笔记

1、先准备一个可以正常上网的相同版本的Ubuntu系统&#xff0c;可以使用虚拟机。Ubuntu系统需要安装好docker compose或docker-compose 2、下载dataease-online-installer-v2.10.4-ce.tar在线安装包&#xff0c;解压并执行install.sh进行安装和启动 3、导出docker镜像 sudo d…...

C 语言雏启:擘画代码乾坤,谛观编程奥宇之初瞰

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。* 这一课主要是让大家初步了解C语言&#xff0c;了解我们的开发环境&#xff0c;main函数&#xff0c;库…...

npm操作大全:从入门到精通

引言 在现代前端开发中&#xff0c;npm&#xff08;Node Package Manager&#xff09;是不可或缺的工具。无论是安装依赖、管理项目&#xff0c;还是发布自己的包&#xff0c;npm都扮演着重要的角色。本文将带你从npm的基础操作开始&#xff0c;逐步深入到高级用法&#xff0c…...

AI绘画入门:探索数字艺术新世界(1/10)

引言&#xff1a;AI 绘画的兴起与现状 在科技飞速发展的当下&#xff0c;AI 绘画如同一场艺术领域的风暴&#xff0c;正以惊人的速度席卷而来&#xff0c;彻底改变着我们对艺术创作的认知。近年来&#xff0c;AI 绘画相关的话题屡屡登上热搜&#xff0c;从社交媒体上各种 AI 生…...

Linux应用编程(五)USB应用开发-libusb库

一、基础知识 1. USB接口是什么&#xff1f; USB接口&#xff08;Universal Serial Bus&#xff09;是一种通用串行总线&#xff0c;广泛使用的接口标准&#xff0c;主要用于连接计算机与外围设备&#xff08;如键盘、鼠标、打印机、存储设备等&#xff09;之间的数据传输和电…...

项目-03-封装echarts组件并使用component动态加载组件

目录 需求场景代码补充说明1. typeComponentMap 讲解2. 为什么要给Echarts实例DOM添加id3. 为什么要在 onMounted 里添加 nextTick4. 为什么要监听props.option 需求 由于需要多次用到echarts&#xff0c;需要封装一个echarts组件动态加载echarts组件 场景代码 场景&#xf…...

使用 Blazor 和 Elsa Workflows 作为引擎的工作流系统开发

开发一个完整的工作流系统使用 Blazor 和 Elsa Workflows 作为引擎&#xff0c;可以实现一个功能强大的工作流管理和设计系统。下面将提供详细的步骤和代码实现&#xff0c;展示如何在 Blazor 中开发一个基于 Elsa Workflows 的工作流系统。 项目概述 我们的工作流系统将包含以…...

Node.js 完全教程:从入门到精通

Node.js 完全教程&#xff1a;从入门到精通 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;允许开发者在服务器端使用 JavaScript。它的非阻塞 I/O 和事件驱动架构使得 Node.js 非常适合于构建高性能的网络应用。本文将详细介绍 Node.js 的安装、基本语…...

elasticsearch 数据导出/导入

例子&#xff1a; 导出命令&#xff1a; elasticdump --inputhttps://elastic:elasticsearchlocalhost:9100/company --outputcompany.json --typedata --no-verify 注意&#xff0c;本地docker搭建&#xff0c;禁用自签证书验证&#xff0c;先设置环境变量 export NODE_TL…...

什么是三高架构?

大家好&#xff0c;我是锋哥。今天分享关于【什么是三高架构?】面试题。希望对大家有帮助&#xff1b; 什么是三高架构? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 “三高架构”通常是指高可用性&#xff08;High Availability&#xff09;、高性能&#xff…...

Docker 单机快速部署大数据各组件

文章目录 一、Spark1.1 NetWork 网络1.2 安装 Java81.3 安装 Python 环境1.4 Spark 安装部署 二、Kafka三、StarRocks四、Redis五、Rabbitmq六、Emqx6.1 前言6.2 安装部署 七、Flink八、Nacos九、Nginx 一、Spark 1.1 NetWork 网络 docker network lsdocker network create -…...

CSS笔记基础篇01——选择器、文字控制属性、背景属性、显示模式、盒子模型

黑马程序员视频地址&#xff1a; 前端Web开发HTML5CSS3移动web视频教程https://www.bilibili.com/video/BV1kM4y127Li?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodeshttps://www.bilibili.com/video/BV1kM4y127Li?vd_source0a2d3666…...

pytest全局配置文件pytest.ini

pytest.ini 改变 pytest 的默认行为&#xff0c;一般放在项目的根目录&#xff0c;不能包含中文符号。不管是主函数模式运行&#xff0c;命令行模式运行&#xff0c;都会去读取这个全局配置文件。 [pytest] ;配置命令行参数&#xff0c;用空格进行分隔。addopts 中的选项会被命…...

PyTest自学-认识PyTest

1 PyTest自学-认识PyTest 1.1 PyTest可以用来做什么&#xff1f; PyTest是一个自动化测试框架&#xff0c;支持单元测试和功能测试&#xff0c;有丰富的插件&#xff0c;如&#xff0c;pytest-selemium, pytest-html等。 1.2 安装pytest 使用pip install -U pytest。 1.3 py…...

【专题】为2025制定可付诸实践的IT战略规划报告汇总PDF洞察(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p39055 在当今瞬息万变的商业环境中&#xff0c;制定有效的 IT 战略规划对于企业的成功与可持续发展至关重要。本报告深入探讨了制定 IT 战略规划的关键活动&#xff0c;旨在为企业和决策者提供全面且实用的指导。 Gartner的《为202…...

自旋锁与CAS

上文我们认识了许许多多的锁&#xff0c;此篇我们的CAS就是从上文的锁策略开展的新概念&#xff0c;我们来一探究竟吧 1. 什么是CAS&#xff1f; CAS: 全称Compare and swap&#xff0c;字⾯意思:“比较并交换”&#xff0c;⼀个CAS涉及到以下操作&#xff1a; 我们假设内存中…...

数组-二分查找

目录 算法思想&#xff1a; 实践&#xff1a; 备注&#xff1a; 二分查找是一种高效的查找算法&#xff0c;适用于在 有序数组 或列表中快速定位目标元素的索引。 重要事情说三遍&#xff1a;使用前提&#xff1a;数组有序&#xff0c;无重复&#xff0c;如果数组未排序&am…...

如何使用 Python 进行文件读写操作?

大家好&#xff0c;我是 V 哥。今天的内容来介绍 Python 中进行文件读写操作的方法&#xff0c;这在学习 Python 时是必不可少的技术点&#xff0c;希望可以帮助到正在学习 python的小伙伴。 以下是 Python 中进行文件读写操作的基本方法&#xff1a; 一、文件读取&#xff1…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...