jiateng_ws/widgets/settings_widget.py

140 lines
5.5 KiB
Python
Raw Normal View History

2025-06-07 10:45:09 +08:00
from PySide6.QtWidgets import QMessageBox
import logging
from ui.settings_ui import SettingsUI
from utils.sql_utils import SQLUtils
class SettingsWidget(SettingsUI):
def __init__(self, parent=None):
super().__init__(parent)
self.parent = parent
# 连接信号和槽
self.connect_signals()
# 初始化数据库类型UI状态
self.update_db_ui_state()
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)
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)
# 尝试执行简单查询
if db_type == "sqlite":
db.execute_query("SELECT sqlite_version();")
elif db_type == "pgsql":
db.execute_query("SELECT version();")
elif db_type == "mysql":
db.execute_query("SELECT version();")
result = db.fetchone()
db.close()
# 显示成功消息
QMessageBox.information(self, "连接成功", f"数据库连接测试成功!\n数据库版本: {result[0]}")
logging.info(f"数据库连接测试成功,类型: {db_type}, 版本: {result[0]}")
except Exception as e:
# 显示错误消息
QMessageBox.critical(self, "连接失败", f"数据库连接测试失败!\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}")