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}")