from PySide6.QtCore import QObject, Slot, Signal, QTimer from PySide6.QtWebChannel import QWebChannel import time class WebviewBridge(QObject): """Webview桥接类,用于处理前端和Python后端之间的通信""" # 定义信号 time_updated = Signal(str) message_received = Signal(str) def __init__(self, parent=None): super().__init__(parent) self.frontend_ready = False self.timer = QTimer() self.timer.timeout.connect(self.send_time) @Slot() def on_frontend_ready(self): """当前端准备就绪时调用""" print("Frontend is ready") self.frontend_ready = True # 启动定时器,每秒更新一次时间 self.timer.start(1000) @Slot(str, result=str) def hello(self, message): """处理前端发送的消息""" print('Message received from frontend:', message) response = f'Hello from Python: {message}' self.message_received.emit(response) return response def send_time(self): """定期向前端发送时间更新""" if self.frontend_ready: current_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) self.time_updated.emit(current_time) return current_time return None def set_frontend_ready(self, ready=True): """设置前端准备状态""" self.frontend_ready = ready class WebviewController(QObject): """Webview控制器类,负责管理Webview的逻辑""" def __init__(self, web_engine_page, parent=None): super().__init__(parent) self.page = web_engine_page self.bridge = WebviewBridge() self.channel = QWebChannel() self.channel.registerObject('py', self.bridge) self.page.setWebChannel(self.channel) # 连接bridge的信号 self.bridge.time_updated.connect(self.on_time_updated) self.bridge.message_received.connect(self.on_message_received) def on_time_updated(self, time_str): """当bridge发出time_updated信号时调用""" print(f"Time updated: {time_str}") # 调用前端的update_time函数 js_code = f""" try {{ if (typeof update_time !== 'undefined' && typeof update_time === 'function') {{ update_time('{time_str}'); }} }} catch (e) {{ console.error('Error calling update_time:', e); }} """ self.page.runJavaScript(js_code) def on_message_received(self, message): """当bridge发出message_received信号时调用""" print(f"Message received: {message}") # 调用前端的消息处理函数 js_code = f""" try {{ if (typeof app_sendMessage !== 'undefined' && typeof app_sendMessage === 'function') {{ app_sendMessage('{message}'); }} }} catch (e) {{ console.error('Error calling app_sendMessage:', e); }} """ self.page.runJavaScript(js_code)