jiateng_ws/widgets/settings_widget.py

208 lines
8.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from PySide6.QtWidgets import QMessageBox, QVBoxLayout
import logging
from ui.settings_ui import SettingsUI
from utils.sql_utils import SQLUtils
from widgets.inspection_settings_widget import InspectionSettingsWidget
from widgets.pallet_type_settings_widget import PalletTypeSettingsWidget
class SettingsWidget(SettingsUI):
def __init__(self, parent=None):
super().__init__(parent)
self.parent = parent
logging.info("正在初始化SettingsWidget")
# 创建检验设置部件
logging.info("创建InspectionSettingsWidget实例")
self.inspection_settings = InspectionSettingsWidget()
# 移除临时占位符标签并添加检验设置部件
if hasattr(self, 'inspection_placeholder'):
logging.info("移除临时占位符")
self.inspection_layout.removeWidget(self.inspection_placeholder)
self.inspection_placeholder.hide()
self.inspection_placeholder.deleteLater()
else:
logging.warning("未找到临时占位符标签")
# 检查布局是否可用
if hasattr(self, 'inspection_layout'):
logging.info("添加检验设置部件到布局")
self.inspection_layout.addWidget(self.inspection_settings)
else:
logging.error("无法找到inspection_layout布局")
# 创建托盘类型设置部件
logging.info("创建PalletTypeSettingsWidget实例")
self.pallet_type_settings = PalletTypeSettingsWidget()
# 移除临时占位符标签并添加托盘类型设置部件
if hasattr(self, 'pallet_type_placeholder'):
logging.info("移除托盘类型临时占位符")
self.pallet_type_layout.removeWidget(self.pallet_type_placeholder)
self.pallet_type_placeholder.hide()
self.pallet_type_placeholder.deleteLater()
else:
logging.warning("未找到托盘类型临时占位符标签")
# 检查布局是否可用
if hasattr(self, 'pallet_type_layout'):
logging.info("添加托盘类型设置部件到布局")
self.pallet_type_layout.addWidget(self.pallet_type_settings)
else:
logging.error("无法找到pallet_type_layout布局")
# 连接信号和槽
self.connect_signals()
# 初始化数据库类型UI状态
self.update_db_ui_state()
logging.info("SettingsWidget初始化完成")
def connect_signals(self):
# 数据库类型选择
self.sqlite_radio.toggled.connect(self.update_db_ui_state)
self.pgsql_radio.toggled.connect(self.update_db_ui_state)
self.mysql_radio.toggled.connect(self.update_db_ui_state)
# 按钮动作
self.test_conn_button.clicked.connect(self.test_connection)
self.save_db_button.clicked.connect(self.save_db_settings)
# 检验配置变更信号
self.inspection_settings.signal_configs_changed.connect(self.handle_inspection_configs_changed)
# 托盘类型配置变更信号
self.pallet_type_settings.signal_pallet_types_changed.connect(self.handle_pallet_types_changed)
# 返回按钮
if hasattr(self, 'back_button'):
self.back_button.clicked.connect(self.back_to_main)
def update_db_ui_state(self):
"""根据选择的数据库类型更新UI状态"""
if self.sqlite_radio.isChecked():
# SQLite模式下只需要数据库文件路径
self.host_input.setEnabled(False)
self.host_input.setText("")
self.user_input.setEnabled(False)
self.user_input.setText("")
self.password_input.setEnabled(False)
self.password_input.setText("")
self.port_input.setEnabled(False)
self.port_input.setText("")
self.database_input.setEnabled(True)
self.database_input.setText("db/jtDB.db")
elif self.pgsql_radio.isChecked():
# PostgreSQL模式下需要完整的连接信息
self.host_input.setEnabled(True)
self.host_input.setText("localhost")
self.user_input.setEnabled(True)
self.user_input.setText("postgres")
self.password_input.setEnabled(True)
self.password_input.setText("")
self.port_input.setEnabled(True)
self.port_input.setText("5432")
self.database_input.setEnabled(True)
self.database_input.setText("jtDB")
elif self.mysql_radio.isChecked():
# MySQL模式下需要完整的连接信息
self.host_input.setEnabled(True)
self.host_input.setText("localhost")
self.user_input.setEnabled(True)
self.user_input.setText("root")
self.password_input.setEnabled(True)
self.password_input.setText("")
self.port_input.setEnabled(True)
self.port_input.setText("3306")
self.database_input.setEnabled(True)
self.database_input.setText("jtDB")
def get_db_type(self):
"""获取当前选择的数据库类型"""
if self.sqlite_radio.isChecked():
return "sqlite"
elif self.pgsql_radio.isChecked():
return "pgsql"
elif self.mysql_radio.isChecked():
return "mysql"
return "sqlite" # 默认返回sqlite
def get_connection_params(self):
"""获取数据库连接参数"""
db_type = self.get_db_type()
params = {
"database": self.database_input.text().strip()
}
if db_type != "sqlite":
params.update({
"host": self.host_input.text().strip(),
"user": self.user_input.text().strip(),
"password": self.password_input.text().strip(),
"port": self.port_input.text().strip()
})
return db_type, params
def test_connection(self):
"""测试数据库连接"""
db_type, params = self.get_connection_params()
try:
# 创建数据库连接
db = SQLUtils(db_type, **params)
# 测试连接
db.cursor.execute("SELECT 1")
# 关闭连接
db.close()
# 显示成功消息
QMessageBox.information(self, "连接成功", "数据库连接测试成功!")
logging.info(f"数据库连接测试成功,类型: {db_type}")
except Exception as e:
# 显示错误消息
QMessageBox.critical(self, "连接失败", f"数据库连接测试失败!\n\n错误: {str(e)}")
logging.error(f"数据库连接测试失败,类型: {db_type}, 错误: {str(e)}")
def save_db_settings(self):
"""保存数据库设置"""
db_type = self.get_db_type()
params = self.get_connection_params()[1]
desc = self.desc_input.text().strip()
# 这里应该将设置保存到配置文件中
# 为了简单起见,这里只显示一个消息框
settings_info = f"数据库类型: {db_type}\n"
for key, value in params.items():
if key != "password":
settings_info += f"{key}: {value}\n"
else:
settings_info += f"{key}: {'*' * len(value)}\n"
settings_info += f"说明: {desc}"
QMessageBox.information(self, "设置已保存", f"数据库设置已保存!\n\n{settings_info}")
logging.info(f"数据库设置已保存,类型: {db_type}")
def handle_inspection_configs_changed(self):
"""处理检验配置变更"""
logging.info("检验配置已更新")
# 如果有父窗口,通知父窗口更新检验配置
if self.parent and hasattr(self.parent, 'update_inspection_columns'):
self.parent.update_inspection_columns()
def handle_pallet_types_changed(self):
"""处理托盘类型配置变更"""
logging.info("托盘类型配置已更新")
# 如果有父窗口,通知父窗口更新托盘类型
if self.parent and hasattr(self.parent, 'update_pallet_types'):
self.parent.update_pallet_types()
def back_to_main(self):
"""返回主页"""
if self.parent and hasattr(self.parent, 'show_main_page'):
self.parent.show_main_page()