当前位置: 首页 > 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.lryc.cn/news/574955.html

相关文章:

  • 博图SCL语言中 RETURN 语句使用详解
  • Harmony中的HAP、HAR、HSP区别
  • 《推荐技术算法与实践》
  • Linux Kernel下exFat使用fallocate函数不生效问题
  • 微信小程序 / UNIAPP --- 阻止小程序返回(顶部导航栏返回、左 / 右滑手势、安卓物理返回键和调用 navigateBack 接口)
  • Feign源码解析:动态代理与HTTP请求全流程
  • 《汇编语言:基于X86处理器》第4章 复习题和练习,编程练习
  • 福彩双色球第2025072期篮球号码分析
  • (LeetCode 面试经典 150 题) 151. 反转字符串中的单词(栈+字符串)
  • UNIAPP入门基础
  • 网络安全是什么?
  • 暴雨信创电脑代理商成功中标长沙市中医康复医院
  • iClone 中创建的面部动画导入 Daz 3D
  • 【请关注】实操mongodb集群部署
  • VS2022的C#打包出错解决
  • Liunx操作系统笔记2
  • RS485 vs CAN总线:工业通信双雄的深度对决
  • syncthing忘记密码怎么办(Mac版)?
  • 【大模型实战】微调Qwen2.5 VL模型,增强目标检测任务。
  • 在IIS上运行PHP时显示PHP错误信息
  • web安全之h2注入系统学习
  • 14.Linux Docker
  • H5录音、图文视频IndexDB储存最佳实践:用AI生成语音备忘录
  • 【MCP服务】蓝耘元生代 | MCP平台:部署时间服务器MCP,开启大模型交互新体验
  • Linux RDMA网络配置手册
  • 【图论题典】Swift 解 LeetCode 最小高度树:中心剥离法详解
  • 【GESP】C++四级考试大纲知识点梳理, (2) 结构体和二维数组
  • 跨线程connect传参的错误
  • 微信小程序适配 iPhone 底部导航区域(safe area)的完整指南
  • 打造丝滑的Android应用:LiveData完全教程