504 lines
21 KiB
Python
504 lines
21 KiB
Python
from PySide6.QtWidgets import (
|
||
QWidget, QLabel, QLineEdit, QPushButton, QComboBox, QGridLayout, QHBoxLayout, QVBoxLayout,
|
||
QTabWidget, QFrame, QFormLayout, QGroupBox, QRadioButton, QSpacerItem, QSizePolicy,
|
||
QTableWidget, QTableWidgetItem, QHeaderView, QSlider, QCheckBox, QButtonGroup
|
||
)
|
||
from PySide6.QtGui import QFont, QBrush, QColor, QIntValidator
|
||
from PySide6.QtCore import Qt, Signal, QSize
|
||
|
||
class SettingsUI(QWidget):
|
||
def __init__(self, parent=None):
|
||
super().__init__(parent)
|
||
self.parent = parent
|
||
self.init_ui()
|
||
|
||
def init_ui(self):
|
||
# 设置字体
|
||
self.title_font = QFont("微软雅黑", 14, QFont.Bold)
|
||
self.normal_font = QFont("微软雅黑", 10)
|
||
self.small_font = QFont("微软雅黑", 9)
|
||
|
||
# 创建主布局
|
||
self.main_layout = QVBoxLayout(self)
|
||
self.main_layout.setContentsMargins(10, 10, 10, 10)
|
||
|
||
# 创建标题
|
||
self.title_label = QLabel("系统设置")
|
||
self.title_label.setFont(self.title_font)
|
||
self.title_label.setAlignment(Qt.AlignCenter)
|
||
self.title_label.setStyleSheet("color: #1a237e; margin-bottom: 10px;")
|
||
self.main_layout.addWidget(self.title_label)
|
||
|
||
# 创建选项卡部件
|
||
self.tab_widget = QTabWidget()
|
||
self.tab_widget.setFont(self.normal_font)
|
||
self.main_layout.addWidget(self.tab_widget)
|
||
|
||
# 创建各个选项卡
|
||
self.create_camera_tab()
|
||
self.create_database_tab()
|
||
self.create_inspection_tab()
|
||
self.create_plc_tab()
|
||
self.create_push_tab()
|
||
self.create_auth_tab()
|
||
self.create_user_tab()
|
||
self.create_param_tab()
|
||
self.create_pallet_type_tab()
|
||
|
||
def create_camera_tab(self):
|
||
# 相机设置选项卡
|
||
self.camera_tab = QWidget()
|
||
self.camera_layout = QVBoxLayout(self.camera_tab)
|
||
self.camera_layout.setContentsMargins(20, 20, 20, 20)
|
||
|
||
# 相机选择区域
|
||
self.camera_select_group = QGroupBox("相机选择")
|
||
self.camera_select_group.setFont(self.normal_font)
|
||
self.camera_select_layout = QHBoxLayout()
|
||
|
||
self.camera_label = QLabel("相机设备:")
|
||
self.camera_label.setFont(self.normal_font)
|
||
self.camera_combo = QComboBox()
|
||
self.camera_combo.setFont(self.normal_font)
|
||
self.camera_combo.setMinimumWidth(300)
|
||
|
||
self.refresh_button = QPushButton("刷新设备")
|
||
self.refresh_button.setFont(self.normal_font)
|
||
|
||
self.camera_select_layout.addWidget(self.camera_label)
|
||
self.camera_select_layout.addWidget(self.camera_combo)
|
||
self.camera_select_layout.addWidget(self.refresh_button)
|
||
self.camera_select_layout.addStretch(1)
|
||
self.camera_select_group.setLayout(self.camera_select_layout)
|
||
self.camera_layout.addWidget(self.camera_select_group)
|
||
|
||
# 相机控制区域
|
||
self.camera_control_group = QGroupBox("相机控制")
|
||
self.camera_control_group.setFont(self.normal_font)
|
||
self.camera_control_layout = QHBoxLayout()
|
||
|
||
self.open_button = QPushButton("打开相机")
|
||
self.open_button.setFont(self.normal_font)
|
||
self.open_button.setFixedWidth(120)
|
||
|
||
self.close_button = QPushButton("关闭相机")
|
||
self.close_button.setFont(self.normal_font)
|
||
self.close_button.setFixedWidth(120)
|
||
|
||
self.test_button = QPushButton("测试预览")
|
||
self.test_button.setFont(self.normal_font)
|
||
self.test_button.setFixedWidth(120)
|
||
|
||
self.camera_control_layout.addWidget(self.open_button)
|
||
self.camera_control_layout.addWidget(self.close_button)
|
||
self.camera_control_layout.addWidget(self.test_button)
|
||
self.camera_control_layout.addStretch(1)
|
||
self.camera_control_group.setLayout(self.camera_control_layout)
|
||
self.camera_layout.addWidget(self.camera_control_group)
|
||
|
||
# 相机参数设置区域
|
||
self.camera_params_group = QGroupBox("相机参数")
|
||
self.camera_params_group.setFont(self.normal_font)
|
||
self.camera_params_layout = QGridLayout()
|
||
self.camera_params_layout.setColumnStretch(1, 1) # 让滑块列占据更多空间
|
||
|
||
# 曝光时间
|
||
self.exposure_label = QLabel("曝光时间:")
|
||
self.exposure_label.setFont(self.normal_font)
|
||
self.exposure_slider = QSlider(Qt.Horizontal)
|
||
self.exposure_slider.setMinimum(1000)
|
||
self.exposure_slider.setMaximum(50000)
|
||
self.exposure_slider.setValue(20000)
|
||
self.exposure_slider.setTickPosition(QSlider.TicksBelow)
|
||
self.exposure_slider.setTickInterval(5000)
|
||
self.exposure_value = QLabel("20000 μs")
|
||
self.exposure_value.setFont(self.normal_font)
|
||
self.exposure_value.setMinimumWidth(80)
|
||
|
||
# 增益
|
||
self.gain_label = QLabel("增益:")
|
||
self.gain_label.setFont(self.normal_font)
|
||
self.gain_slider = QSlider(Qt.Horizontal)
|
||
self.gain_slider.setMinimum(0)
|
||
self.gain_slider.setMaximum(100)
|
||
self.gain_slider.setValue(10)
|
||
self.gain_slider.setTickPosition(QSlider.TicksBelow)
|
||
self.gain_slider.setTickInterval(10)
|
||
self.gain_value = QLabel("10")
|
||
self.gain_value.setFont(self.normal_font)
|
||
self.gain_value.setMinimumWidth(80)
|
||
|
||
# 帧率
|
||
self.framerate_label = QLabel("帧率:")
|
||
self.framerate_label.setFont(self.normal_font)
|
||
self.framerate_slider = QSlider(Qt.Horizontal)
|
||
self.framerate_slider.setMinimum(1)
|
||
self.framerate_slider.setMaximum(30)
|
||
self.framerate_slider.setValue(15)
|
||
self.framerate_slider.setTickPosition(QSlider.TicksBelow)
|
||
self.framerate_slider.setTickInterval(5)
|
||
self.framerate_value = QLabel("15 fps")
|
||
self.framerate_value.setFont(self.normal_font)
|
||
self.framerate_value.setMinimumWidth(80)
|
||
|
||
# 添加到布局
|
||
self.camera_params_layout.addWidget(self.exposure_label, 0, 0)
|
||
self.camera_params_layout.addWidget(self.exposure_slider, 0, 1)
|
||
self.camera_params_layout.addWidget(self.exposure_value, 0, 2)
|
||
|
||
self.camera_params_layout.addWidget(self.gain_label, 1, 0)
|
||
self.camera_params_layout.addWidget(self.gain_slider, 1, 1)
|
||
self.camera_params_layout.addWidget(self.gain_value, 1, 2)
|
||
|
||
self.camera_params_layout.addWidget(self.framerate_label, 2, 0)
|
||
self.camera_params_layout.addWidget(self.framerate_slider, 2, 1)
|
||
self.camera_params_layout.addWidget(self.framerate_value, 2, 2)
|
||
|
||
self.camera_params_group.setLayout(self.camera_params_layout)
|
||
self.camera_layout.addWidget(self.camera_params_group)
|
||
|
||
# 相机设置按钮
|
||
self.camera_buttons_layout = QHBoxLayout()
|
||
|
||
self.get_params_button = QPushButton("获取参数")
|
||
self.get_params_button.setFont(self.normal_font)
|
||
self.get_params_button.setFixedWidth(120)
|
||
|
||
self.set_params_button = QPushButton("设置参数")
|
||
self.set_params_button.setFont(self.normal_font)
|
||
self.set_params_button.setFixedWidth(120)
|
||
|
||
self.save_camera_button = QPushButton("保存设置")
|
||
self.save_camera_button.setFont(self.normal_font)
|
||
self.save_camera_button.setFixedWidth(120)
|
||
|
||
self.camera_buttons_layout.addStretch(1)
|
||
self.camera_buttons_layout.addWidget(self.get_params_button)
|
||
self.camera_buttons_layout.addWidget(self.set_params_button)
|
||
self.camera_buttons_layout.addWidget(self.save_camera_button)
|
||
|
||
self.camera_layout.addLayout(self.camera_buttons_layout)
|
||
|
||
# 预览区域
|
||
self.preview_group = QGroupBox("相机预览")
|
||
self.preview_group.setFont(self.normal_font)
|
||
self.preview_layout = QVBoxLayout()
|
||
|
||
self.preview_frame = QFrame()
|
||
self.preview_frame.setFrameShape(QFrame.Box)
|
||
self.preview_frame.setLineWidth(1)
|
||
self.preview_frame.setMinimumHeight(200)
|
||
self.preview_frame.setStyleSheet("background-color: black;")
|
||
|
||
self.preview_layout.addWidget(self.preview_frame)
|
||
self.preview_group.setLayout(self.preview_layout)
|
||
self.camera_layout.addWidget(self.preview_group)
|
||
|
||
# 添加弹性空间
|
||
self.camera_layout.addStretch(1)
|
||
|
||
self.tab_widget.addTab(self.camera_tab, "相机设置")
|
||
|
||
def create_database_tab(self):
|
||
# 数据源设置选项卡
|
||
self.database_tab = QWidget()
|
||
self.database_layout = QVBoxLayout(self.database_tab)
|
||
self.database_layout.setContentsMargins(20, 20, 20, 20)
|
||
|
||
# 数据源类型选择
|
||
self.db_type_group = QGroupBox("数据源类型")
|
||
self.db_type_group.setFont(self.normal_font)
|
||
self.db_type_layout = QHBoxLayout()
|
||
|
||
self.db_type_combo = QComboBox()
|
||
self.db_type_combo.setFont(self.normal_font)
|
||
self.db_type_combo.addItem("SQLite")
|
||
self.db_type_combo.addItem("PostgreSQL")
|
||
self.db_type_combo.addItem("MySQL")
|
||
|
||
self.db_type_layout.addWidget(QLabel("当前配置类型:"))
|
||
self.db_type_layout.addWidget(self.db_type_combo)
|
||
self.db_type_layout.addStretch(1)
|
||
|
||
# 添加当前使用的数据源选择
|
||
self.current_source_label = QLabel("当前使用的数据源:")
|
||
self.current_source_label.setFont(self.normal_font)
|
||
self.current_source_combo = QComboBox()
|
||
self.current_source_combo.setFont(self.normal_font)
|
||
self.current_source_combo.addItems(["SQLite", "PostgreSQL", "MySQL"])
|
||
|
||
self.db_type_layout.addWidget(self.current_source_label)
|
||
self.db_type_layout.addWidget(self.current_source_combo)
|
||
|
||
self.db_type_group.setLayout(self.db_type_layout)
|
||
self.database_layout.addWidget(self.db_type_group)
|
||
|
||
# 添加运行模式选择组
|
||
self.mode_group = QGroupBox("运行模式")
|
||
self.mode_group.setFont(self.normal_font)
|
||
self.mode_layout = QHBoxLayout()
|
||
|
||
# 创建单选按钮组
|
||
self.mode_button_group = QButtonGroup(self)
|
||
|
||
# 创建单机模式单选按钮
|
||
self.standalone_mode_radio = QRadioButton("单机模式")
|
||
self.standalone_mode_radio.setFont(self.normal_font)
|
||
self.standalone_mode_radio.setChecked(True) # 默认选中单机模式
|
||
self.mode_button_group.addButton(self.standalone_mode_radio, 1)
|
||
|
||
# 创建接口模式单选按钮
|
||
self.api_mode_radio = QRadioButton("接口模式")
|
||
self.api_mode_radio.setFont(self.normal_font)
|
||
self.mode_button_group.addButton(self.api_mode_radio, 2)
|
||
|
||
# 添加单选按钮到布局
|
||
self.mode_layout.addWidget(QLabel("选择运行模式:"))
|
||
self.mode_layout.addWidget(self.standalone_mode_radio)
|
||
self.mode_layout.addWidget(self.api_mode_radio)
|
||
self.mode_layout.addStretch(1)
|
||
|
||
self.mode_group.setLayout(self.mode_layout)
|
||
self.database_layout.addWidget(self.mode_group)
|
||
|
||
# 数据库连接设置
|
||
self.db_conn_group = QGroupBox("连接设置")
|
||
self.db_conn_group.setFont(self.normal_font)
|
||
self.db_conn_layout = QFormLayout()
|
||
|
||
self.host_label = QLabel("主机:")
|
||
self.host_label.setFont(self.normal_font)
|
||
self.host_input = QLineEdit()
|
||
self.host_input.setFont(self.normal_font)
|
||
self.host_input.setPlaceholderText("localhost")
|
||
|
||
self.user_label = QLabel("用户:")
|
||
self.user_label.setFont(self.normal_font)
|
||
self.user_input = QLineEdit()
|
||
self.user_input.setFont(self.normal_font)
|
||
|
||
self.password_label = QLabel("密码:")
|
||
self.password_label.setFont(self.normal_font)
|
||
self.password_input = QLineEdit()
|
||
self.password_input.setFont(self.normal_font)
|
||
self.password_input.setEchoMode(QLineEdit.Password)
|
||
|
||
self.database_label = QLabel("数据库:")
|
||
self.database_label.setFont(self.normal_font)
|
||
self.database_input = QLineEdit()
|
||
self.database_input.setFont(self.normal_font)
|
||
self.database_input.setPlaceholderText("db/jtDB.db")
|
||
|
||
self.port_label = QLabel("端口:")
|
||
self.port_label.setFont(self.normal_font)
|
||
self.port_input = QLineEdit()
|
||
self.port_input.setFont(self.normal_font)
|
||
|
||
self.desc_label = QLabel("说明:")
|
||
self.desc_label.setFont(self.normal_font)
|
||
self.desc_input = QLineEdit()
|
||
self.desc_input.setFont(self.normal_font)
|
||
|
||
self.db_conn_layout.addRow(self.host_label, self.host_input)
|
||
self.db_conn_layout.addRow(self.user_label, self.user_input)
|
||
self.db_conn_layout.addRow(self.password_label, self.password_input)
|
||
self.db_conn_layout.addRow(self.database_label, self.database_input)
|
||
self.db_conn_layout.addRow(self.port_label, self.port_input)
|
||
self.db_conn_layout.addRow(self.desc_label, self.desc_input)
|
||
|
||
self.db_conn_group.setLayout(self.db_conn_layout)
|
||
self.database_layout.addWidget(self.db_conn_group)
|
||
|
||
# 按钮区域
|
||
self.db_buttons_layout = QHBoxLayout()
|
||
|
||
self.test_conn_button = QPushButton("测试连接")
|
||
self.test_conn_button.setFont(self.normal_font)
|
||
self.test_conn_button.setFixedWidth(120)
|
||
|
||
self.save_db_button = QPushButton("保存设置")
|
||
self.save_db_button.setFont(self.normal_font)
|
||
self.save_db_button.setFixedWidth(120)
|
||
|
||
self.db_buttons_layout.addStretch(1)
|
||
self.db_buttons_layout.addWidget(self.test_conn_button)
|
||
self.db_buttons_layout.addSpacing(20)
|
||
self.db_buttons_layout.addWidget(self.save_db_button)
|
||
|
||
self.database_layout.addLayout(self.db_buttons_layout)
|
||
self.database_layout.addStretch(1)
|
||
|
||
self.tab_widget.addTab(self.database_tab, "数据源设置")
|
||
|
||
def create_inspection_tab(self):
|
||
"""创建检验配置选项卡"""
|
||
# 检验配置选项卡
|
||
self.inspection_tab = QWidget()
|
||
self.inspection_layout = QVBoxLayout(self.inspection_tab)
|
||
self.inspection_layout.setContentsMargins(0, 0, 0, 0)
|
||
self.inspection_layout.setSpacing(0)
|
||
|
||
# 添加一个临时提示标签,表示此处将由InspectionSettingsWidget替换
|
||
self.inspection_placeholder = QLabel("正在加载检验配置...")
|
||
self.inspection_placeholder.setFont(self.normal_font)
|
||
self.inspection_placeholder.setAlignment(Qt.AlignCenter)
|
||
self.inspection_placeholder.setStyleSheet("color: #888888; padding: 20px;")
|
||
self.inspection_layout.addWidget(self.inspection_placeholder)
|
||
|
||
# 添加到选项卡
|
||
self.tab_widget.addTab(self.inspection_tab, "检验配置")
|
||
|
||
def create_plc_tab(self):
|
||
# PLC设置选项卡
|
||
self.plc_tab = QWidget()
|
||
self.plc_layout = QVBoxLayout(self.plc_tab)
|
||
self.plc_layout.setContentsMargins(20, 20, 20, 20)
|
||
|
||
# 创建Modbus配置组
|
||
self.modbus_group = QGroupBox("Modbus 配置")
|
||
self.modbus_group.setFont(self.normal_font)
|
||
self.modbus_layout = QFormLayout(self.modbus_group)
|
||
self.modbus_layout.setContentsMargins(15, 20, 15, 15)
|
||
self.modbus_layout.setSpacing(15)
|
||
|
||
# 主机地址输入框
|
||
self.modbus_host_input = QLineEdit()
|
||
self.modbus_host_input.setFont(self.normal_font)
|
||
self.modbus_host_input.setPlaceholderText("请输入Modbus主机地址")
|
||
self.modbus_layout.addRow(QLabel("主机地址:"), self.modbus_host_input)
|
||
|
||
# 端口输入框
|
||
self.modbus_port_input = QLineEdit()
|
||
self.modbus_port_input.setFont(self.normal_font)
|
||
self.modbus_port_input.setPlaceholderText("请输入Modbus端口")
|
||
self.modbus_port_input.setValidator(QIntValidator(1, 65535))
|
||
self.modbus_layout.addRow(QLabel("端口:"), self.modbus_port_input)
|
||
|
||
# 测试连接按钮
|
||
self.modbus_test_button = QPushButton("测试连接")
|
||
self.modbus_test_button.setFont(self.normal_font)
|
||
self.modbus_test_button.setStyleSheet("""
|
||
QPushButton {
|
||
background-color: #2196f3;
|
||
color: white;
|
||
border: none;
|
||
border-radius: 3px;
|
||
padding: 5px 15px;
|
||
}
|
||
QPushButton:hover {
|
||
background-color: #1e88e5;
|
||
}
|
||
""")
|
||
self.modbus_layout.addRow("", self.modbus_test_button)
|
||
|
||
# 添加Modbus配置组到布局
|
||
self.plc_layout.addWidget(self.modbus_group)
|
||
|
||
# 添加保存按钮
|
||
self.plc_save_button = QPushButton("保存配置")
|
||
self.plc_save_button.setFont(self.normal_font)
|
||
self.plc_save_button.setFixedSize(120, 40)
|
||
self.plc_save_button.setStyleSheet("""
|
||
QPushButton {
|
||
background-color: #4caf50;
|
||
color: white;
|
||
border: none;
|
||
border-radius: 5px;
|
||
}
|
||
QPushButton:hover {
|
||
background-color: #45a049;
|
||
}
|
||
QPushButton:pressed {
|
||
background-color: #3d8b40;
|
||
}
|
||
""")
|
||
|
||
# 添加按钮布局
|
||
button_layout = QHBoxLayout()
|
||
button_layout.addStretch(1)
|
||
button_layout.addWidget(self.plc_save_button)
|
||
|
||
self.plc_layout.addLayout(button_layout)
|
||
self.plc_layout.addStretch(1)
|
||
|
||
self.tab_widget.addTab(self.plc_tab, "PLC设置")
|
||
|
||
def create_push_tab(self):
|
||
# 推送设置选项卡
|
||
self.push_tab = QWidget()
|
||
self.push_layout = QVBoxLayout(self.push_tab)
|
||
self.push_layout.setContentsMargins(20, 20, 20, 20)
|
||
|
||
# 占位标签
|
||
self.push_placeholder = QLabel("推送设置(待实现)")
|
||
self.push_placeholder.setFont(self.normal_font)
|
||
self.push_placeholder.setAlignment(Qt.AlignCenter)
|
||
self.push_layout.addWidget(self.push_placeholder)
|
||
self.push_layout.addStretch(1)
|
||
|
||
self.tab_widget.addTab(self.push_tab, "推送设置")
|
||
|
||
def create_auth_tab(self):
|
||
# 授权设置选项卡
|
||
self.auth_tab = QWidget()
|
||
self.auth_layout = QVBoxLayout(self.auth_tab)
|
||
self.auth_layout.setContentsMargins(20, 20, 20, 20)
|
||
|
||
# 占位标签
|
||
self.auth_placeholder = QLabel("授权设置(待实现)")
|
||
self.auth_placeholder.setFont(self.normal_font)
|
||
self.auth_placeholder.setAlignment(Qt.AlignCenter)
|
||
self.auth_layout.addWidget(self.auth_placeholder)
|
||
self.auth_layout.addStretch(1)
|
||
|
||
self.tab_widget.addTab(self.auth_tab, "授权设置")
|
||
|
||
def create_user_tab(self):
|
||
# 用户设置选项卡
|
||
self.user_tab = QWidget()
|
||
self.user_layout = QVBoxLayout(self.user_tab)
|
||
self.user_layout.setContentsMargins(20, 20, 20, 20)
|
||
|
||
# 占位标签
|
||
self.user_placeholder = QLabel("用户设置(待实现)")
|
||
self.user_placeholder.setFont(self.normal_font)
|
||
self.user_placeholder.setAlignment(Qt.AlignCenter)
|
||
self.user_layout.addWidget(self.user_placeholder)
|
||
self.user_layout.addStretch(1)
|
||
|
||
self.tab_widget.addTab(self.user_tab, "用户设置")
|
||
|
||
def create_param_tab(self):
|
||
# 参数配置选项卡
|
||
self.param_tab = QWidget()
|
||
self.param_layout = QVBoxLayout(self.param_tab)
|
||
self.param_layout.setContentsMargins(20, 20, 20, 20)
|
||
|
||
# 占位标签
|
||
self.param_placeholder = QLabel("参数配置(待实现)")
|
||
self.param_placeholder.setFont(self.normal_font)
|
||
self.param_placeholder.setAlignment(Qt.AlignCenter)
|
||
self.param_layout.addWidget(self.param_placeholder)
|
||
self.param_layout.addStretch(1)
|
||
|
||
self.tab_widget.addTab(self.param_tab, "参数配置")
|
||
|
||
def create_pallet_type_tab(self):
|
||
# 托盘类型设置选项卡
|
||
self.pallet_type_tab = QWidget()
|
||
self.pallet_type_layout = QVBoxLayout(self.pallet_type_tab)
|
||
self.pallet_type_layout.setContentsMargins(20, 20, 20, 20)
|
||
|
||
# 占位标签
|
||
self.pallet_type_placeholder = QLabel("正在加载托盘类型设置...")
|
||
self.pallet_type_placeholder.setFont(self.normal_font)
|
||
self.pallet_type_placeholder.setAlignment(Qt.AlignCenter)
|
||
self.pallet_type_placeholder.setStyleSheet("color: #888888; padding: 20px;")
|
||
self.pallet_type_layout.addWidget(self.pallet_type_placeholder)
|
||
|
||
self.tab_widget.addTab(self.pallet_type_tab, "托盘类型")
|
||
|
||
def back_to_main(self):
|
||
"""返回主页"""
|
||
if self.parent and hasattr(self.parent, 'show_main_page'):
|
||
self.parent.show_main_page() |