新建仓库
This commit is contained in:
commit
c28642bdec
|
@ -0,0 +1,7 @@
|
||||||
|
# 包含一整套流程的报告生成工具,包括:
|
||||||
|
- 数据获取:文件获取数据
|
||||||
|
- 数据预处理:阴暗处亮度增加,细节增强。
|
||||||
|
- 数据报告生成:基于模板批量生成报告。
|
||||||
|
|
||||||
|
|
||||||
|

|
|
@ -0,0 +1,14 @@
|
||||||
|
{
|
||||||
|
"项目名称": "123",
|
||||||
|
"风场名": "123",
|
||||||
|
"风场地址": "123",
|
||||||
|
"甲方公司": "123",
|
||||||
|
"甲方负责人": "123",
|
||||||
|
"甲方负责人电话": "123",
|
||||||
|
"乙方公司": "武汉迪特聚能科技有限公司",
|
||||||
|
"乙方负责人": "123",
|
||||||
|
"乙方负责人电话": "123",
|
||||||
|
"项目规格": "123",
|
||||||
|
"项目工期": "123",
|
||||||
|
"json路径": "/home/dtyx/桌面/yhh/ReportGenerator/config/项目基本信息"
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
{
|
||||||
|
"项目名称": "123",
|
||||||
|
"风场名": "123",
|
||||||
|
"风场地址": "213",
|
||||||
|
"甲方公司": "123",
|
||||||
|
"甲方负责人": "123",
|
||||||
|
"甲方负责人电话": "123",
|
||||||
|
"乙方公司": "武汉迪特聚能科技有限公司",
|
||||||
|
"乙方负责人": "123",
|
||||||
|
"乙方负责人电话": "123",
|
||||||
|
"项目规格": "213",
|
||||||
|
"项目工期": "123",
|
||||||
|
"json路径": "/home/dtyx/桌面/yhh/ReportGenerator/config/项目基本信息"
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,198 @@
|
||||||
|
from PySide6.QtGui import QFont
|
||||||
|
# ====================== 样式宏定义 ======================
|
||||||
|
# 字体设置
|
||||||
|
FONT_PATH = "font/SourceHanSerifCN-Medium.ttf" # 指定字体文件路径
|
||||||
|
FONT_FAMILY = "Source Han Serif CN" # 字体家族名称
|
||||||
|
TITLE_FONT_SIZE = 12
|
||||||
|
CONTENT_FONT_SIZE = 11
|
||||||
|
BUTTON_FONT_SIZE = 11
|
||||||
|
|
||||||
|
# 颜色定义
|
||||||
|
PRIMARY_COLOR = "#2c3e50"
|
||||||
|
SECONDARY_COLOR = "#34495e"
|
||||||
|
ACCENT_COLOR = "#3498db"
|
||||||
|
SUCCESS_COLOR = "#2ecc71"
|
||||||
|
LIGHT_COLOR = "#ecf0f1"
|
||||||
|
DARK_COLOR = "#2c3e50"
|
||||||
|
TEXT_COLOR = "#2c3e50"
|
||||||
|
LIGHT_TEXT_COLOR = "#ecf0f1"
|
||||||
|
|
||||||
|
# 按钮样式
|
||||||
|
BUTTON_WIDTH = 100
|
||||||
|
BUTTON_HEIGHT = 34
|
||||||
|
BUTTON_RADIUS = 4
|
||||||
|
BUTTON_FONT_WEIGHT = QFont.Weight.Medium
|
||||||
|
|
||||||
|
BUTTON_STYLE = f"""
|
||||||
|
QPushButton {{
|
||||||
|
font-family: "{FONT_FAMILY}";
|
||||||
|
font-size: {BUTTON_FONT_SIZE}pt;
|
||||||
|
font-weight: {BUTTON_FONT_WEIGHT};
|
||||||
|
color: {TEXT_COLOR};
|
||||||
|
background-color: {LIGHT_COLOR};
|
||||||
|
border: 1px solid {SECONDARY_COLOR};
|
||||||
|
border-radius: {BUTTON_RADIUS}px;
|
||||||
|
padding: 6px 12px;
|
||||||
|
min-width: {BUTTON_WIDTH}px;
|
||||||
|
min-height: {BUTTON_HEIGHT}px;
|
||||||
|
}}
|
||||||
|
QPushButton:hover {{
|
||||||
|
background-color: #dfe6ec;
|
||||||
|
}}
|
||||||
|
QPushButton:pressed {{
|
||||||
|
background-color: #d0d7dd;
|
||||||
|
}}
|
||||||
|
"""
|
||||||
|
|
||||||
|
PRIMARY_BUTTON_STYLE = f"""
|
||||||
|
QPushButton {{
|
||||||
|
font-family: "{FONT_FAMILY}";
|
||||||
|
font-size: {BUTTON_FONT_SIZE + 1}pt;
|
||||||
|
font-weight: {BUTTON_FONT_WEIGHT};
|
||||||
|
color: {LIGHT_TEXT_COLOR};
|
||||||
|
background-color: {PRIMARY_COLOR};
|
||||||
|
border: 1px solid {DARK_COLOR};
|
||||||
|
border-radius: {BUTTON_RADIUS}px;
|
||||||
|
padding: 8px 16px;
|
||||||
|
}}
|
||||||
|
QPushButton:hover {{
|
||||||
|
background-color: #34495e;
|
||||||
|
}}
|
||||||
|
QPushButton:pressed {{
|
||||||
|
background-color: #2c3e50;
|
||||||
|
}}
|
||||||
|
"""
|
||||||
|
|
||||||
|
# 下拉框样式
|
||||||
|
COMBO_BOX_HEIGHT = 34
|
||||||
|
COMBO_BOX_STYLE = f"""
|
||||||
|
QComboBox {{
|
||||||
|
font-family: "{FONT_FAMILY}";
|
||||||
|
font-size: {CONTENT_FONT_SIZE}pt;
|
||||||
|
min-height: {COMBO_BOX_HEIGHT}px;
|
||||||
|
padding: 5px 10px;
|
||||||
|
border: 1px solid #bdc3c7;
|
||||||
|
border-radius: 4px;
|
||||||
|
}}
|
||||||
|
QComboBox::drop-down {{
|
||||||
|
width: 30px;
|
||||||
|
border-left: 1px solid #bdc3c7;
|
||||||
|
}}
|
||||||
|
"""
|
||||||
|
|
||||||
|
# 组框样式
|
||||||
|
GROUP_BOX_MIN_WIDTH = 380
|
||||||
|
GROUP_BOX_MIN_HEIGHT = 200
|
||||||
|
GROUP_BOX_SPACING = 15
|
||||||
|
GROUP_BOX_MARGINS = (15, 15, 15, 15)
|
||||||
|
GROUP_BOX_STYLE = f"""
|
||||||
|
QGroupBox {{
|
||||||
|
font-family: "{FONT_FAMILY}";
|
||||||
|
font-size: {TITLE_FONT_SIZE}pt;
|
||||||
|
font-weight: bold;
|
||||||
|
color: {PRIMARY_COLOR};
|
||||||
|
border: 1px solid #bdc3c7;
|
||||||
|
border-radius: 5px;
|
||||||
|
margin-top: 10px;
|
||||||
|
}}
|
||||||
|
QGroupBox::title {{
|
||||||
|
subcontrol-origin: margin;
|
||||||
|
left: 10px;
|
||||||
|
padding: 0 3px;
|
||||||
|
}}
|
||||||
|
"""
|
||||||
|
|
||||||
|
# 标签样式
|
||||||
|
LABEL_STYLE = f"""
|
||||||
|
QLabel {{
|
||||||
|
font-family: "{FONT_FAMILY}";
|
||||||
|
font-size: {CONTENT_FONT_SIZE}pt;
|
||||||
|
color: {TEXT_COLOR};
|
||||||
|
}}
|
||||||
|
"""
|
||||||
|
|
||||||
|
PATH_DISPLAY_STYLE = f"""
|
||||||
|
QLabel {{
|
||||||
|
font-family: "{FONT_FAMILY}";
|
||||||
|
font-size: {CONTENT_FONT_SIZE}pt;
|
||||||
|
background-color: {LIGHT_COLOR};
|
||||||
|
border: 1px solid #dee2e6;
|
||||||
|
border-radius: 4px;
|
||||||
|
padding: 10px;
|
||||||
|
min-height: 80px;
|
||||||
|
color: {TEXT_COLOR};
|
||||||
|
}}
|
||||||
|
"""
|
||||||
|
|
||||||
|
# 主窗口样式
|
||||||
|
WINDOW_MIN_WIDTH = 1000
|
||||||
|
WINDOW_MIN_HEIGHT = 720
|
||||||
|
MAIN_LAYOUT_SPACING = 20
|
||||||
|
MAIN_LAYOUT_MARGINS = (25, 25, 25, 25)
|
||||||
|
|
||||||
|
# 信息标签样式 (左侧固定标签)
|
||||||
|
INFO_LABEL_STYLE = f"""
|
||||||
|
QLabel {{
|
||||||
|
{LABEL_STYLE}
|
||||||
|
min-height: {COMBO_BOX_HEIGHT}px;
|
||||||
|
padding: 5px;
|
||||||
|
min-width: 100px;
|
||||||
|
}}
|
||||||
|
"""
|
||||||
|
|
||||||
|
# 信息显示样式 (右侧内容)
|
||||||
|
INFO_DISPLAY_STYLE = f"""
|
||||||
|
QLabel {{
|
||||||
|
{PATH_DISPLAY_STYLE}
|
||||||
|
min-height: {COMBO_BOX_HEIGHT}px;
|
||||||
|
border-radius: 4px;
|
||||||
|
}}
|
||||||
|
"""
|
||||||
|
|
||||||
|
# 分隔线样式
|
||||||
|
SEPARATOR_STYLE = """
|
||||||
|
QFrame {
|
||||||
|
border: 1px solid #dee2e6;
|
||||||
|
margin: 10px 0;
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
|
||||||
|
# 等待提示样式
|
||||||
|
WAITING_LABEL_STYLE = f"""
|
||||||
|
QLabel {{
|
||||||
|
{LABEL_STYLE}
|
||||||
|
font-size: {TITLE_FONT_SIZE}pt;
|
||||||
|
qproperty-alignment: AlignCenter;
|
||||||
|
}}
|
||||||
|
"""
|
||||||
|
|
||||||
|
CHECKBOX_SIZE = 16 # 复选框大小
|
||||||
|
CHECKBOX_MARGIN = 4 # 边距
|
||||||
|
|
||||||
|
# 基础CheckBox样式
|
||||||
|
CHECKBOX_STYLE = f"""
|
||||||
|
QCheckBox {{
|
||||||
|
font-family: "{FONT_FAMILY}";
|
||||||
|
font-size: {CONTENT_FONT_SIZE}pt;
|
||||||
|
color: {TEXT_COLOR};
|
||||||
|
spacing: 8px;
|
||||||
|
padding: {CHECKBOX_MARGIN}px;
|
||||||
|
}}
|
||||||
|
QCheckBox::indicator {{
|
||||||
|
width: {CHECKBOX_SIZE}px;
|
||||||
|
height: {CHECKBOX_SIZE}px;
|
||||||
|
}}
|
||||||
|
"""
|
||||||
|
|
||||||
|
# 主色调CheckBox
|
||||||
|
PRIMARY_CHECKBOX_STYLE = f"""
|
||||||
|
{CHECKBOX_STYLE}
|
||||||
|
QCheckBox::indicator {{
|
||||||
|
border: 1px solid {PRIMARY_COLOR};
|
||||||
|
border-radius: 3px;
|
||||||
|
}}
|
||||||
|
QCheckBox::indicator:checked {{
|
||||||
|
background-color: {PRIMARY_COLOR};
|
||||||
|
image: url(:/icons/check_white.svg);
|
||||||
|
}}
|
||||||
|
"""
|
|
@ -0,0 +1,109 @@
|
||||||
|
from PySide6.QtWidgets import (QApplication, QMainWindow, QWidget, QGridLayout,
|
||||||
|
QPushButton, QSizePolicy)
|
||||||
|
from PySide6.QtGui import QFontDatabase
|
||||||
|
from PySide6.QtCore import Signal
|
||||||
|
import os
|
||||||
|
from info_core.defines import *
|
||||||
|
from info_core.MyQtClass import ConfigComboBoxGroup, FolderImportWidget, ImageAnalysisWidget
|
||||||
|
|
||||||
|
|
||||||
|
class ReportGeneratorUI(QMainWindow):
|
||||||
|
send_baogao_choose_info = Signal(list[str])
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__()
|
||||||
|
# 加载字体
|
||||||
|
self.load_font()
|
||||||
|
|
||||||
|
# 设置窗口属性
|
||||||
|
self.setWindowTitle("报告生成器")
|
||||||
|
self.setMinimumSize(WINDOW_MIN_WIDTH, WINDOW_MIN_HEIGHT)
|
||||||
|
|
||||||
|
# 主窗口部件
|
||||||
|
self.central_widget = QWidget()
|
||||||
|
self.setCentralWidget(self.central_widget)
|
||||||
|
|
||||||
|
# 主布局
|
||||||
|
self.main_layout = QGridLayout(self.central_widget)
|
||||||
|
self.main_layout.setSpacing(MAIN_LAYOUT_SPACING)
|
||||||
|
self.main_layout.setContentsMargins(*MAIN_LAYOUT_MARGINS)
|
||||||
|
|
||||||
|
# 初始化UI
|
||||||
|
self.init_ui()
|
||||||
|
|
||||||
|
|
||||||
|
def load_font(self):
|
||||||
|
"""加载自定义字体"""
|
||||||
|
if os.path.exists(FONT_PATH):
|
||||||
|
font_id = QFontDatabase.addApplicationFont(FONT_PATH)
|
||||||
|
if font_id == -1:
|
||||||
|
print("字体加载失败,将使用系统默认字体")
|
||||||
|
else:
|
||||||
|
print(f"字体文件未找到: {FONT_PATH},将使用系统默认字体")
|
||||||
|
|
||||||
|
def init_ui(self):
|
||||||
|
"""初始化所有UI组件"""
|
||||||
|
# 第一行:项目信息和人员配置
|
||||||
|
self.project_group = ConfigComboBoxGroup("项目基本信息")
|
||||||
|
self.staff_group = ConfigComboBoxGroup("单次检查配置信息", is_project=False)
|
||||||
|
self.main_layout.addWidget(self.project_group, 0, 0)
|
||||||
|
self.main_layout.addWidget(self.staff_group, 0, 1)
|
||||||
|
|
||||||
|
# 第二行:导入图片路径、填写机组信息
|
||||||
|
self.picture_group = FolderImportWidget("导入图片路径")
|
||||||
|
self.main_layout.addWidget(self.picture_group, 1, 0)
|
||||||
|
self.image_analysis = ImageAnalysisWidget("填写机组信息")
|
||||||
|
self.main_layout.addWidget(self.image_analysis, 1, 1)
|
||||||
|
# 连接信号
|
||||||
|
self.picture_group.main_folder_selected.connect(self.image_analysis.set_image_folder)
|
||||||
|
self.image_analysis.generate_path_selected.connect(self.on_generate_path_selected)
|
||||||
|
|
||||||
|
# 获取请求信号,调用获取函数,发送更新信号
|
||||||
|
self.picture_group.get_baogao_choose_info.connect(self.get_baogao_choose_info)
|
||||||
|
self.send_baogao_choose_info.connect(self.picture_group.update_baogao_choose_info)
|
||||||
|
|
||||||
|
# 第三行:生成报告按钮(跨两列)
|
||||||
|
self.create_generate_button()
|
||||||
|
self.generate_btn.setEnabled(False)
|
||||||
|
self.main_layout.addWidget(self.generate_btn, 2, 0, 1, 2)
|
||||||
|
|
||||||
|
# 设置列和行的拉伸比例
|
||||||
|
self.main_layout.setColumnStretch(0, 1) # 第一列拉伸比例
|
||||||
|
self.main_layout.setColumnStretch(1, 1) # 第二列拉伸比例
|
||||||
|
self.main_layout.setRowStretch(0, 1) # 第一行拉伸比例为1
|
||||||
|
self.main_layout.setRowStretch(1, 4) # 第二行拉伸比例为4
|
||||||
|
self.main_layout.setRowStretch(2, 0) # 第三行不拉伸(固定高度)
|
||||||
|
|
||||||
|
def on_generate_path_selected(self, path):
|
||||||
|
self.generate_btn.setEnabled(True)
|
||||||
|
|
||||||
|
def get_baogao_choose_info(self):
|
||||||
|
search_file_list = []
|
||||||
|
if self.image_analysis.check_is_waibu:
|
||||||
|
search_file_list.append("外汇总")
|
||||||
|
if self.image_analysis.check_is_neibu:
|
||||||
|
search_file_list.append("内汇总")
|
||||||
|
if self.image_analysis.check_is_fanglei:
|
||||||
|
search_file_list.append("防汇总")
|
||||||
|
self.send_baogao_choose_info.emit(search_file_list)
|
||||||
|
|
||||||
|
def create_button(self, text):
|
||||||
|
"""创建统一风格的按钮"""
|
||||||
|
btn = QPushButton(text)
|
||||||
|
btn.setStyleSheet(BUTTON_STYLE)
|
||||||
|
btn.setFixedSize(BUTTON_WIDTH, BUTTON_HEIGHT)
|
||||||
|
return btn
|
||||||
|
|
||||||
|
def create_generate_button(self):
|
||||||
|
"""创建生成报告按钮"""
|
||||||
|
self.generate_btn = QPushButton("生成报告")
|
||||||
|
self.generate_btn.setStyleSheet(PRIMARY_BUTTON_STYLE)
|
||||||
|
self.generate_btn.setFixedHeight(50)
|
||||||
|
self.generate_btn.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app = QApplication([])
|
||||||
|
window = ReportGeneratorUI()
|
||||||
|
window.show()
|
||||||
|
app.exec()
|
Loading…
Reference in New Issue