当前位置: 首页 > 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…...

色彩心理学与品牌情感:vibrant.js颜色提取终极指南 [特殊字符]

色彩心理学与品牌情感&#xff1a;vibrant.js颜色提取终极指南 &#x1f3a8; 【免费下载链接】vibrant.js Extract prominent colors from an image. JS port of Androids Palette. 项目地址: https://gitcode.com/gh_mirrors/vi/vibrant.js 在数字时代&#xff0c;色彩…...

OpenClaw隐私保护方案:Qwen3-14B本地处理VS第三方API对比

OpenClaw隐私保护方案&#xff1a;Qwen3-14B本地处理VS第三方API对比 1. 隐私保护的核心战场 去年帮朋友处理一个自动化需求时&#xff0c;我第一次意识到AI助手的隐私边界问题。他们团队需要处理大量客户访谈录音&#xff0c;但使用某知名云端AI服务后&#xff0c;法务部门突…...

别让格式毁掉你的毕业论文!Paperxie AI 排版:3 分钟复刻学校官方标准

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AIPPThttps://www.paperxie.cn/format/typesettinghttps://www.paperxie.cn/format/typesetting 一、 本科生的痛&#xff1a;论文写完了&#xff0c;格式却能逼疯人 毕业论文的终极考验&#xff0c;从来都…...

mysql如何审计误删除数据操作_mysql binlog逆向分析追踪

需用mysqlbinlog解析ROW格式binlog&#xff0c;查找DELETE_ROWS_EVENT及邻近GTID/QUERY事件中的用户、时间、线程信息&#xff0c;结合时间窗口与应用日志交叉定位误删操作。怎么从 binlog 找到谁删了哪条记录MySQL 本身不记录“谁在什么时间删了 id123 的数据”&#xff0c;但…...

拆穿名词诈骗!用大白话理解晦涩难懂的AI概念媳

1. 架构背景与演进动力 1.1 从单体到碎片化&#xff1a;.NET 的开源征程 在.NET Framework 时代&#xff0c;构建系统主要围绕 Windows 操作系统紧密集成&#xff0c;采用传统的封闭式开发模式。然而&#xff0c;随着.NET Core 的推出&#xff0c;微软开启了彻底的开源与跨平台…...

OpenClaw 源码泄露风波:一场由 “手滑” 引发的 AI 安全大地震

&#x1f525;个人主页&#xff1a;北极的代码&#xff08;欢迎来访&#xff09; &#x1f3ac;作者简介&#xff1a;java后端学习者 ❄️个人专栏&#xff1a;苍穹外卖日记&#xff0c;SSM框架深入&#xff0c;JavaWeb ✨命运的结局尽可永在&#xff0c;不屈的挑战却不可须臾或…...

打字不如说话,说话不如截图——AI 代码助手的多模态输入实践偈

整体排查思路 我们的目标是验证以下三个环节是否正常&#xff1a; 登录成功时&#xff1a;服务器是否正确生成了Session并返回了包含正确 JSESSIONID的Cookie给浏览器。 浏览器端&#xff1a;浏览器是否成功接收并存储了该Cookie。 后续请求&#xff1a;浏览器在执行查询等操作…...

山西太原传媒艺考评价榜第 1 名

在山西太原&#xff0c;艺天影视培训学校凭借其卓越的教学质量和丰富的行业资源&#xff0c;连续多年稳居传媒艺考评价榜榜首。本文将从师资力量、教学体系、硬件设施以及升学成果四个方面&#xff0c;详细解读艺天影视培训学校的成功之道&#xff0c;并为有志于传媒艺术的学子…...

电源防反接方案设计与工程实践

1. 电源反接的危害与防护必要性在工业控制、自动化设备等需要手动接线的应用场景中&#xff0c;电源反接是最常见的人为操作失误之一。我曾参与过一个工业PLC控制柜项目&#xff0c;现场工程师在调试时不慎将24V电源极性接反&#xff0c;导致价值上万元的控制模块瞬间烧毁。这种…...

MMC储能、分布式储能Simulink仿真及DCDC升降压储能模块的SOC均衡控制采用模型预测控制

mmc储能 分布式储能simulink仿真 soc均衡控制 采用模型预测控制 dcdc升降压储能模块最近在搞MMC储能的仿真项目&#xff0c;发现这玩意儿真是电网调频的宝藏工具。特别是当分布式储能单元遇上模块化多电平换流器&#xff0c;SOC均衡控制就成了最烧脑的环节。今天咱们就撸起袖…...