pyside_queue_sqlite/app/signal/test_webview.py

90 lines
3.1 KiB
Python
Raw Normal View History

2025-09-06 16:06:30 +08:00
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)