diff --git a/tests/common.py b/tests/common.py new file mode 100644 index 0000000..8a34c85 --- /dev/null +++ b/tests/common.py @@ -0,0 +1,17 @@ +import sys +import os + +# 注意: 只在 tests 目录下的 测试文件中使用 +# 设置项目目录 为搜索目录 + + +# 通用逻辑:添加项目根目录到搜索路径 +def add_project_root_to_path(): + # 获取项目根目录(tests的上级目录) + project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + if project_root not in sys.path: + sys.path.append(project_root) + + +# 自动执行(导入时就添加路径) +add_project_root_to_path() diff --git a/tests/test_emv.py b/tests/test_emv.py new file mode 100644 index 0000000..2293834 --- /dev/null +++ b/tests/test_emv.py @@ -0,0 +1,234 @@ +from common import * + +from PySide6.QtWidgets import ( + QApplication, + QWidget, + QVBoxLayout, + QHBoxLayout, + QSpacerItem, + QSizePolicy, + QLabel, +) +from PySide6.QtCore import Qt, QTimer, Signal +from qfluentwidgets import ( + PushButton, + LineEdit, + BodyLabel, + MessageBox, + setTheme, + Theme, +) +import sys + + +class DOWidget(QWidget): + # open开关按下 + open_btn_clicked_sig = Signal() + + # close开关按下 + close_btn_clicked_sig = Signal() + + def __init__(self, title: str, parent=None): + super().__init__(parent) + self.title = title # DO名称(如"DO1") + self.is_open = False # 初始状态:关闭 + self.__initWidget() + + def __initWidget(self): + + # 创建控件 + self.__createWidget() + + # 设置样式 + self.__initStyles() + + # 设置布局 + self.__initLayout() + + # 绑定 + self.__bind() + + def __createWidget(self): + # Do按钮名称的 label + self.title_label = BodyLabel(self.title) + self.title_label.setAlignment(Qt.AlignCenter) + + # 状态指示灯 + self.status_light = QLabel() + self.status_light.setFixedSize(40, 40) + + # 打开和关闭按钮 + self.open_btn = PushButton("打开") + self.close_btn = PushButton("关闭") + + def __initStyles(self): + # 状态指示灯样式(初始颜色:灰色(关闭)) + self.status_light.setStyleSheet( + """ + border-radius: 20px; + background-color: gray; + """ + ) + + def __initLayout(self): + # 垂直布局:标题 → 状态灯 → 按钮 + main_layout = QVBoxLayout(self) + main_layout.setContentsMargins(15, 15, 15, 15) # 内边距 + main_layout.setSpacing(12) # 控件间距 + + # 按钮布局 + btn_layout = QHBoxLayout() + btn_layout.setSpacing(8) + btn_layout.addWidget(self.open_btn) + btn_layout.addWidget(self.close_btn) + + main_layout.addWidget(self.title_label) # 添加按钮名称 + main_layout.addWidget(self.status_light, alignment=Qt.AlignCenter) # 添加指示灯 + main_layout.addLayout(btn_layout) + + def __bind(self): + self.open_btn.clicked.connect(self.open_btn_clicked_sig) + self.close_btn.clicked.connect(self.close_btn_clicked_sig) + + # def on_open(self): + # """打开按钮点击事件:更新状态灯为绿色""" + # self.is_open = True + # self.status_light.setStyleSheet( + # """ + # border-radius: 20px; + # background-color: green; /* 打开 → 绿色 */ + # """ + # ) + + # def on_close(self): + # """关闭按钮点击事件:更新状态灯为灰色""" + # self.is_open = False + # self.status_light.setStyleSheet( + # """ + # border-radius: 20px; + # background-color: gray; /* 关闭 → 灰色 */ + # """ + # ) + + +class EmvTestUi(QWidget): + def __init__(self): + super().__init__() + self.setWindowTitle("继电器调试") + self.resize(1000, 600) + self.setStyleSheet("background-color: white;") # 背景颜色,根据主题来变化 + self.__initWidget() + + def __initWidget(self): + + # 创建控件 + self.__createWidget() + + # 设置样式 + self.__initStyles() + + # 设置布局 + self.__initLayout() + + # 绑定 + self.__bind() + + def __createWidget(self): + # Tcp连接控件 + # IP控件 + self.ip_label = BodyLabel("设备IP: ") + self.ip_edit = LineEdit() + self.ip_edit.setText("192.168.0.18") # 默认IP + + # 端口控件 + self.port_label = BodyLabel("设备端口号: ") + self.port_edit = LineEdit() + self.port_edit.setText("50000") # 默认端口 + + # 连接按钮 + self.connect_btn = PushButton("连接") + # 功能测试按钮 + self.test_btn = PushButton("功能测试") + + # 三个Do模块 + self.do1_model = DOWidget("DO1") + self.do2_model = DOWidget("DO2") + self.do3_model = DOWidget("DO3") + + def __initStyles(self): + # 设置样式 (to do) + pass + + def __initLayout(self): + # 顶部的连接布局 + top_layout = QHBoxLayout() + top_layout.addWidget(self.ip_label) + top_layout.addWidget(self.ip_edit) + top_layout.addWidget(self.port_label) + top_layout.addWidget(self.port_edit) + top_layout.addWidget(self.connect_btn) + top_layout.addWidget(self.test_btn) + + # 三个Do开关区域布局 + do_layout = QHBoxLayout() + do_layout.setSpacing(60) # DO模块之间的间距 + do_layout.setAlignment(Qt.AlignCenter) # 水平居中 + + do_layout.addWidget(self.do1_model) + do_layout.addWidget(self.do2_model) + do_layout.addWidget(self.do3_model) + + # 主布局 + main_layout = QVBoxLayout(self) + main_layout.setContentsMargins(60, 60, 60, 60) + main_layout.setSpacing(30) + + main_layout.addLayout(top_layout) + main_layout.addLayout(do_layout) + + main_layout.addItem( + QSpacerItem(0, 0, QSizePolicy.Minimum, QSizePolicy.Expanding) + ) + + def __bind(self): + pass + self.connect_btn.clicked.connect(self.on_connect) + + def on_connect(self): + """连接按钮点击事件:切换状态为“连接中...”,模拟连接过程""" + # 禁用按钮 + 修改文字 + self.connect_btn.setEnabled(False) + self.connect_btn.setText("连接中...") + + # 模拟连接过程(实际应替换为真实的网络请求,如socket连接) + self.timer = QTimer(self) + self.timer.setSingleShot(True) + self.timer.timeout.connect(self.simulate_connection_result) + self.timer.start(2000) # 模拟2秒连接耗时 + + def simulate_connection_result(self): + """模拟连接结果(这里固定返回失败,实际需根据真实逻辑修改)""" + # 模拟连接失败(实际中通过try-except或网络返回判断) + connection_success = False # TODO: 替换为真实连接结果 + + if not connection_success: + # 弹出连接失败对话框 + # 正确创建警告对话框:通过 type 参数指定为警告类型 + msg_box = MessageBox( + "连接失败", # 标题 + "无法连接到设备, 请检查IP和端口是否正确!!", # 内容 + self, # 父窗口 + ) + msg_box.exec() # 显示对话框 + + # 恢复按钮状态 + self.connect_btn.setEnabled(True) + self.connect_btn.setText("连接") + + +if __name__ == "__main__": + app = QApplication(sys.argv) + setTheme(Theme.LIGHT) + window = EmvTestUi() + window.show() + sys.exit(app.exec()) diff --git a/test_login1.py b/tests/test_login1.py similarity index 99% rename from test_login1.py rename to tests/test_login1.py index f9cf6a1..e002a6b 100644 --- a/test_login1.py +++ b/tests/test_login1.py @@ -1,3 +1,5 @@ +from common import * + import sys from PySide6.QtWidgets import ( QApplication, diff --git a/test_login2.py b/tests/test_login2.py similarity index 99% rename from test_login2.py rename to tests/test_login2.py index dc52905..5f4c9ab 100644 --- a/test_login2.py +++ b/tests/test_login2.py @@ -1,3 +1,5 @@ +from common import * + import sys from PySide6.QtWidgets import ( QApplication, diff --git a/test_moju.py b/tests/test_moju.py similarity index 99% rename from test_moju.py rename to tests/test_moju.py index 59f3995..5d5ac4c 100644 --- a/test_moju.py +++ b/tests/test_moju.py @@ -1,3 +1,5 @@ +from common import * + from PySide6.QtWidgets import ( QApplication, QWidget, diff --git a/test_register.py b/tests/test_register.py similarity index 99% rename from test_register.py rename to tests/test_register.py index 84a55cb..5e7a7eb 100644 --- a/test_register.py +++ b/tests/test_register.py @@ -1,3 +1,5 @@ +from common import * + from PySide6.QtWidgets import ( QApplication, QWidget, diff --git a/test_teachhtml.py b/tests/test_teachhtml.py similarity index 99% rename from test_teachhtml.py rename to tests/test_teachhtml.py index fd179b5..00da274 100644 --- a/test_teachhtml.py +++ b/tests/test_teachhtml.py @@ -1,3 +1,5 @@ +from common import * + import sys from PySide6.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget from PySide6.QtWebEngineWidgets import QWebEngineView diff --git a/tests/test_weight.py b/tests/test_weight.py new file mode 100644 index 0000000..4e6acd9 --- /dev/null +++ b/tests/test_weight.py @@ -0,0 +1,146 @@ +from common import * + +from PySide6.QtWidgets import ( + QApplication, + QWidget, + QFormLayout, + QHBoxLayout, + QVBoxLayout, + QLabel, + QSpacerItem, + QSizePolicy, +) +from PySide6.QtCore import Qt +from qfluentwidgets import LineEdit, PushButton, StrongBodyLabel + + +class WeightControlUI(QWidget): + def __init__(self, parent=None): + super().__init__(parent) + + # ========== 1. 窗口基础设置 ========== + self.setWindowTitle("计量一体机调试") + self.resize(800, 600) # 窗口大小 + self.setStyleSheet("background-color: white;") # 背景颜色,根据主题来变化 + + self.__initWidget() + + def __initWidget(self): + + # 创建控件 + self.__createWidget() + + # 设置样式 + self.__initStyles() + + # 设置布局 + self.__initLayout() + + def __createWidget(self): + # ========== 创建表单控件 ========== + # 右侧编辑栏 + self.target_weight_edit = LineEdit() + self.target_weight_edit.setPlaceholderText("目标重量") + + self.current_weight_edit = LineEdit() + self.current_weight_edit.setPlaceholderText("当前重量") + self.current_weight_edit.setReadOnly(True) # 只读 + + self.error_edit = LineEdit() + self.error_edit.setPlaceholderText("误差") + self.error_edit.setReadOnly(True) # 只读 + + # ========== 按钮 ========== + self.calibrate_btn = PushButton("重量标定") + self.confirm_btn = PushButton("确认") + self.compensate_btn = PushButton("补称") + self.motor_forward_btn = PushButton("电机正转") + self.motor_reverse_btn = PushButton("电机反转") + + def __initStyles(self): + # 设置按钮大小 + # 固定大小为 160x46 + for btn in [ + self.calibrate_btn, + self.confirm_btn, + self.compensate_btn, + self.motor_forward_btn, + self.motor_reverse_btn, + ]: + btn.setFixedSize(160, 46) # 固定按钮尺寸 + + def __initLayout(self): + # ========== 布局设计 ========== + # 表单布局(标签+输入框,右对齐) + form_layout = QFormLayout() + form_layout.addRow(StrongBodyLabel("目标重量:"), self.target_weight_edit) + form_layout.addRow(StrongBodyLabel("当前重量:"), self.current_weight_edit) + form_layout.addRow(StrongBodyLabel("误差:"), self.error_edit) + form_layout.setRowWrapPolicy(QFormLayout.DontWrapRows) # 禁止换行 + form_layout.setVerticalSpacing(20) # 行间距 + form_layout.setLabelAlignment(Qt.AlignLeft | Qt.AlignVCenter) # 标签左对齐 + + # 用QHBoxLayout 包裹 form_layout,两侧加弹簧 + form_horizontal_layout = QHBoxLayout() + # 左侧弹簧:占据左边多余空间 + form_horizontal_layout.addItem( + QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Minimum) + ) + # 添加表单布局 + form_horizontal_layout.addLayout(form_layout) + # 右侧弹簧:占据右边多余空间 + form_horizontal_layout.addItem( + QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Minimum) + ) + + # 按钮布局(第一行:重量标定 + 确认;第二行:补称 + 电机正转 + 电机反转) + # 第一行按钮布局(中间留空,让按钮居中) + btn_row1_layout = QHBoxLayout() + btn_row1_layout.addSpacerItem( + QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Minimum) + ) + btn_row1_layout.addWidget(self.calibrate_btn) + btn_row1_layout.addSpacerItem( + QSpacerItem(160, 0, QSizePolicy.Fixed, QSizePolicy.Minimum) + ) # 两个按钮之间的间距为160 + btn_row1_layout.addWidget(self.confirm_btn) + btn_row1_layout.addSpacerItem( + QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Minimum) + ) + + # 第二行按钮布局(均匀分布) + btn_row2_layout = QHBoxLayout() + btn_row2_layout.addWidget(self.compensate_btn) + btn_row2_layout.addSpacerItem( + QSpacerItem(60, 0, QSizePolicy.Fixed, QSizePolicy.Minimum) + ) + btn_row2_layout.addWidget(self.motor_forward_btn) + btn_row2_layout.addSpacerItem( + QSpacerItem(60, 0, QSizePolicy.Fixed, QSizePolicy.Minimum) + ) + btn_row2_layout.addWidget(self.motor_reverse_btn) + btn_row2_layout.setContentsMargins(0, 0, 0, 0) # 清除边距 + + # 主布局(垂直排列:表单 + 按钮行1 + 按钮行2) + main_layout = QVBoxLayout(self) + main_layout.addLayout(form_horizontal_layout) + main_layout.addSpacing(40) # 表单与按钮的间距 + main_layout.addLayout(btn_row1_layout) + main_layout.addSpacing(30) # 两行按钮的间距 + main_layout.addLayout(btn_row2_layout) + main_layout.setContentsMargins(80, 60, 80, 60) # 窗口内边距 + # main_layout.setAlignment(Qt.AlignTop | Qt.AlignHCenter) # 整体上对齐,水平居中 + main_layout.setAlignment(Qt.AlignVCenter | Qt.AlignHCenter) # 垂直、水平居中 + + +if __name__ == "__main__": + import sys + + app = QApplication(sys.argv) + # 设置qfluentwidgets全局主题(如浅色主题) + from qfluentwidgets import setTheme, Theme + + setTheme(Theme.LIGHT) + window = WeightControlUI() + window.show() + sys.exit(app.exec())