pyside_queue_sqlite/app/signal/test_webview.py
2025-09-06 16:06:30 +08:00

90 lines
3.1 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.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)