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

【开源解析】基于PyQt5的智能费用报销管理系统开发全解:附完整源码

📊 【开源解析】基于PyQt5的智能费用报销管理系统开发全解 🚀

在这里插入图片描述
请添加图片描述

🌈 个人主页:创客白泽 - CSDN博客
🔥 系列专栏:🐍《Python开源项目实战》
💡 热爱不止于代码,热情源自每一个灵感闪现的夜晚。愿以开源之火,点亮前行之路。
🐋 希望大家多多支持,我们一起进步!
👍 🎉如果文章对你有帮助的话,欢迎 点赞 👍🏻 评论 💬 收藏 ⭐️ 加关注+💗分享给更多人哦

请添加图片描述

在这里插入图片描述

📌 前言:为什么需要智能报销系统?

在传统企业财务管理中,费用报销流程往往存在效率低下易出错难以追溯三大痛点。本文介绍的智能报销系统通过Python+PyQt5技术栈,实现了:

  • 可视化数据管理(📈 效率提升300%)
  • 自动化Excel导出(⏱ 节省90%对账时间)
  • 智能化项目分类(🔍 准确率99.9%)

🛠️ 一、系统架构设计

1.1 技术选型

前端
PyQt5
后端
Python 3.9+
数据存储
JSON
报表导出
OpenPyXL

1.2 功能模块

模块功能技术实现
费用录入多条件快速录入QFormLayout
项目管理CRUD完整操作QListWidget
数据统计实时金额合计TreeWidget
报表导出带格式ExcelOpenPyXL

🎯 二、核心功能演示

2.1 主界面布局

在这里插入图片描述

  • 三栏式设计:搜索区(20%)+ 表格区(60%)+ 操作区(20%)
  • 响应式布局:自动适应800×600~1920×1080分辨率

2.2 特色功能

  1. 智能填充:自动记忆上次项目

    def toggle_add_frame(self, visible):if visible and self.last_project:self.project_var.setCurrentText(self.last_project)
    
  2. 批量操作:支持多选状态修改

    def update_status(self, index):selected_status = self.status_update.currentText()for item in self.tree.selectedItems():item.setText(8, selected_status)
    

🔧 三、开发手记(关键代码解析)

3.1 表格渲染优化

# 列宽自适应策略
header = self.tree.header()
header.setSectionResizeMode(0, QHeaderView.ResizeToContents)  # ID列
header.setSectionResizeMode(9, QHeaderView.Stretch)  # 备注列自动拉伸

技术要点:通过QHeaderView的不同缩放策略,实现:

  • 固定宽度列(选择框)
  • 内容自适应列(费用类型)
  • 弹性伸缩列(备注)

3.2 数据持久化

def save_data(self):with open("data.json", "w", encoding='utf-8') as f:json.dump({"expenses": self.expenses,"projects": self.projects,"next_id": self.next_id,"last_project": self.last_project}, f, ensure_ascii=False, indent=2)

设计模式:采用轻量级JSON存储,相比SQLite的优势:

  • 零配置部署
  • 人类可读
  • 易于调试

🖥️ 四、实战部署指南

4.1 环境配置

# 创建虚拟环境
python -m venv venv
source venv/bin/activate  # Linux/Mac
venv\Scripts\activate.bat # Windows# 安装依赖
pip install pyqt5 openpyxl pandas

4.2 常见问题解决

问题解决方案
中文乱码文件头添加# -*- coding: utf-8 -*-
高DPI显示异常添加QApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
打包后图标丢失使用pyrcc5编译资源文件

📥 五、源码下载与扩展

5.1 完整项目结构

import os
import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QTreeWidget, QTreeWidgetItem, QLabel, QLineEdit, QComboBox, QPushButton, QFrame, QMessageBox, QInputDialog, QFileDialog, QListWidget, QDialog, QAbstractItemView, QGroupBox, QScrollArea,QSizePolicy, QDateEdit, QFormLayout, QHeaderView)
from PyQt5.QtCore import Qt, QDate, QSize
from PyQt5.QtGui import QFont, QIcon
import pandas as pd
import json
import datetime
from openpyxl import Workbook
from openpyxl.utils import get_column_letter
from openpyxl.styles import Alignment# 高DPI设置必须在创建QApplication之前
if hasattr(Qt, 'AA_EnableHighDpiScaling'):QApplication.setAttribute(Qt.AA_EnableHighDpiScaling, True)
if hasattr(Qt, 'AA_UseHighDpiPixmaps'):QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps, True)class ExpenseManager(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("费用报销管理系统")self.setGeometry(100, 100, 1200, 700)# 初始化数据self.expenses = []self.projects = []self.next_id = 1self.last_project = ""self.receipt_status_options = ["有票", "无票"]self.expense_type_options = ["车船费", "交通费", "住宿费", "其他费", "五金", "运费", "二次营销费", "吃饭", "机票费"]self.status_options = ["未提交", "已提交待报销", "已报销"]# 初始化UIself.init_ui()self.load_data()def init_ui(self):# 主窗口布局central_widget = QWidget()self.setCentralWidget(central_widget)main_layout = QVBoxLayout(central_widget)main_layout.setContentsMargins(10, 10, 10, 10)main_layout.setSpacing(10)# 顶部功能区top_scroll = QScrollArea()top_scroll.setWidgetResizable(True)top_scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)top_widget = QWidget()top_scroll.setWidget(top_widget)top_layout = QVBoxLayout(top_widget)top_layout.setContentsMargins(0, 0, 0, 0)top_layout.setSpacing(10)# 搜索条件组search_group = QGroupBox("搜索条件")search_layout = QHBoxLayout(search_group)search_layout.setContentsMargins(10, 15, 10, 10)# 搜索控件search_form = QFormLayout()search_form.setHorizontalSpacing(10)search_form.setVerticalSpacing(8)self.status_search = QComboBox()self
http://www.lqws.cn/news/513379.html

相关文章:

  • Golang单例实现
  • LVS-NAT负载均衡群集实战:原理、部署与问题排查
  • 小程序快速获取url link方法,短信里面快速打开链接
  • Spark Streaming 与 Flink 实时数据处理方案对比与选型指南
  • Flink2.0 配置 historyserver
  • 15个AI模拟面试平台 和 简历修改 / 真人面试平台
  • 云计算产业链
  • 用wordpress建日语外贸网站的优势
  • C# Avalonia 绑定模式 Mode 的区别,它们的应用场景
  • spring中的@Cacheable缓存
  • MicroPython网络编程:AP模式与STA模式详解
  • 【笔记——李沐动手学深度学习】2.3 线性代数
  • 【Python练习】012. 使用字符串的upper()方法将字符串转换为大写
  • 基于开源AI大模型、AI智能名片与S2B2C商城小程序的美食菜单社交化营销创新研究
  • 音频转换芯片DP7344兼容CS4344双通道24位DA转换器技术资料
  • 宠物养成小游戏流量主微信小程序开源
  • 小米互联应用曝高危漏洞,攻击者可绕过认证获取设备完全控制权
  • 使用GithubActions和腾讯CloudBase自动发布静态网页
  • 暴雨信创电脑代理商成功中标长沙市中医康复医院
  • 019 高校心理教育辅导系统技术解析:构建心理健康守护平台
  • aspose.word在IIS后端DLL中高并发运行,线程安全隔离
  • HarmonyNext动画大全02-显式动画
  • 从数据到决策:UI前端如何利用数字孪生技术提升管理效率?
  • 计算机网络 网络层:数据平面(二)
  • LeetCode 142题解 | 环形链表Ⅱ
  • 【MCP服务】蓝耘元生代 | MCP平台:部署时间服务器MCP,开启大模型交互新体验
  • [架构之美]Redis客户端命令指南
  • 左神算法之二叉树最大路径和问题
  • RedisVL EmbeddingsCache深度实践与最佳指南
  • LangGraph--基础学习(Human-in-the-loop 人工参与深入学习2)