[patch] 修改逻辑: 在用户误触或开了多个GUI程序的时候不能同时建立多个连接 确保一个账号只能建立一个与后端的连接 友好提示的集成review
This commit is contained in:
61
main.py
61
main.py
@@ -25,6 +25,12 @@ class UpdateSignals(QObject):
|
||||
update_available = pyqtSignal(str, str) # (latest_version, download_url)
|
||||
|
||||
|
||||
# 新增: 断开连接信号类(用于线程安全的断开提示)
|
||||
class DisconnectSignals(QObject):
|
||||
"""断开连接信号"""
|
||||
disconnected = pyqtSignal(str) # (disconnect_message)
|
||||
|
||||
|
||||
# 新增: 用户名密码输入对话框类
|
||||
class LoginWindow(QMainWindow):
|
||||
def __init__(self):
|
||||
@@ -50,6 +56,10 @@ class LoginWindow(QMainWindow):
|
||||
self.update_signals = UpdateSignals()
|
||||
self.update_signals.update_available.connect(self._show_update_dialog)
|
||||
|
||||
# 创建断开连接信号对象(线程安全)
|
||||
self.disconnect_signals = DisconnectSignals()
|
||||
self.disconnect_signals.disconnected.connect(self._show_disconnect_dialog)
|
||||
|
||||
self.initUI()
|
||||
|
||||
# 延迟设置版本检查器,确保WebSocket连接已建立
|
||||
@@ -437,6 +447,54 @@ class LoginWindow(QMainWindow):
|
||||
except Exception as e:
|
||||
self.add_log(f"处理token错误失败: {e}", "ERROR")
|
||||
|
||||
def on_disconnect(self, disconnect_msg: str):
|
||||
"""处理被踢下线 - 发射信号到主线程(可在任何线程中调用)"""
|
||||
try:
|
||||
self.add_log(f"📡 收到断开通知,准备发射信号: {disconnect_msg}", "INFO")
|
||||
# 发射信号(Qt 自动调度到主线程)
|
||||
self.disconnect_signals.disconnected.emit(disconnect_msg)
|
||||
self.add_log(f"✅ 断开信号已发射", "DEBUG")
|
||||
except Exception as e:
|
||||
self.add_log(f"❌ 发射断开信号失败: {e}", "ERROR")
|
||||
import traceback
|
||||
self.add_log(f"详细错误: {traceback.format_exc()}", "ERROR")
|
||||
|
||||
def _show_disconnect_dialog(self, disconnect_msg: str):
|
||||
"""显示断开连接提示框(信号槽函数,始终在主线程中执行)"""
|
||||
try:
|
||||
self.add_log(f"🎯 主线程收到断开信号: {disconnect_msg}", "INFO")
|
||||
|
||||
# 在状态标签显示警告信息
|
||||
self.status_label.setText(f"⚠️ 账号在其他设备登录")
|
||||
self.status_label.setStyleSheet(
|
||||
"color: #ff9800; background: rgba(255, 152, 0, 0.1); border-radius: 12px; padding: 5px 10px; font-weight: bold;")
|
||||
|
||||
# 重置按钮状态
|
||||
self.login_btn.setEnabled(True)
|
||||
self.login_btn.setText("重新连接")
|
||||
self.login_btn.setObjectName("loginButton") # 恢复原始样式
|
||||
self.login_btn.setStyleSheet(self.login_btn.styleSheet()) # 刷新样式
|
||||
|
||||
# 清空已连接平台列表
|
||||
self.connected_platforms.clear()
|
||||
|
||||
# 显示友好的提示对话框(主线程中执行,不会卡顿)
|
||||
QMessageBox.warning(
|
||||
self,
|
||||
"连接已断开",
|
||||
f"{disconnect_msg}\n\n"
|
||||
"如果是您本人在其他设备登录,可以忽略此提示。\n"
|
||||
"如需继续使用,请点击\"重新连接\"按钮。",
|
||||
QMessageBox.Ok
|
||||
)
|
||||
|
||||
self.add_log("连接已断开,您可以重新连接", "INFO")
|
||||
|
||||
except Exception as e:
|
||||
self.add_log(f"❌ 显示断开提示框失败: {e}", "ERROR")
|
||||
import traceback
|
||||
self.add_log(f"详细错误: {traceback.format_exc()}", "ERROR")
|
||||
|
||||
def delayed_platform_summary(self):
|
||||
"""定时器触发的汇总显示更新"""
|
||||
try:
|
||||
@@ -651,7 +709,8 @@ class LoginWindow(QMainWindow):
|
||||
success=lambda: self.add_log("WebSocket连接管理器连接成功", "SUCCESS"),
|
||||
error=lambda error: self.add_log(f"WebSocket连接管理器错误: {error}", "ERROR"),
|
||||
platform_connected=self.on_platform_connected, # 新增:平台连接回调
|
||||
token_error=self.on_token_error # 新增:token错误回调
|
||||
token_error=self.on_token_error, # 新增:token错误回调
|
||||
disconnect=self.on_disconnect # 新增:被踢下线回调
|
||||
)
|
||||
|
||||
# 连接后端
|
||||
|
||||
Reference in New Issue
Block a user