first commit

This commit is contained in:
2025-09-06 16:06:30 +08:00
commit 401ef07f5f
49 changed files with 18045 additions and 0 deletions
View File
+228
View File
@@ -0,0 +1,228 @@
# coding:utf-8
import sys
import os
from PySide6.QtWidgets import QFrame, QVBoxLayout, QMenu, QApplication, QWidget, QPushButton, QHBoxLayout
from qframelesswindow.webengine import FramelessWebEngineView
from PySide6.QtCore import QPoint, Qt, QUrl
from ...config import config
from ...signal.test_webview import WebviewController
class DevToolsWindow(FramelessWebEngineView):
def __init__(self, parent=None):
super().__init__(parent=parent)
self.setWindowTitle("开发者工具")
self.resize(600, 600)
class DevToolsView(QWidget):
def __init__(self, parent=None):
super().__init__(parent=parent)
self.setWindowTitle("开发者工具")
self.dev_tools_window = DevToolsWindow(self)
self.resize(600, 600)
# 设置窗口大小不可变
self.setFixedSize(self.size())
class WebViewInterface(QFrame):
def __init__(self, parent=None):
super().__init__(parent=parent)
self.setObjectName("webViewInterface")
self.dev_tools_view = None
# 添加连接状态标志
self.is_local_connection = config.get("project", {}).get("is-production", True)
self.webView = FramelessWebEngineView(self)
self.html_path = os.getcwd().replace("\\", '/') + '/resources/webview/test_webview/dist/index.html'
self.remote_url = "http://localhost:8080/"
# 创建WebviewController实例
self.page = self.webView.page()
self.controller = WebviewController(self.page)
# 加载初始页面
self.load_current_page()
# 创建导航按钮
self.back_button = QPushButton("⬅️", self)
self.back_button.clicked.connect(self.webView.back)
self.back_button.setFixedSize(40, 30)
self.back_button.setEnabled(False)
self.forward_button = QPushButton("➡️", self)
self.forward_button.clicked.connect(self.webView.forward)
self.forward_button.setFixedSize(40, 30)
self.forward_button.setEnabled(False)
self.reload_button = QPushButton("🔃", self)
self.reload_button.clicked.connect(self.webView.reload)
self.reload_button.setFixedSize(40, 30)
self.home_button = QPushButton("🏠", self)
self.home_button.clicked.connect(self.go_home)
self.home_button.setFixedSize(40, 30)
# 连接WebView的信号以更新按钮状态
self.webView.urlChanged.connect(self.update_navigation_buttons)
# 创建导航按钮布局
self.nav_button_layout = QHBoxLayout()
self.nav_button_layout.addWidget(self.back_button)
self.nav_button_layout.addWidget(self.forward_button)
self.nav_button_layout.addWidget(self.reload_button)
self.nav_button_layout.addWidget(self.home_button)
self.nav_button_layout.addStretch()
self.nav_button_layout.setSpacing(5)
self.vBoxLayout = QVBoxLayout(self)
self.vBoxLayout.setContentsMargins(10, 48, 10, 10)
self.vBoxLayout.addLayout(self.nav_button_layout)
self.vBoxLayout.addWidget(self.webView)
self.webView.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
self.webView.loadFinished.connect(self.on_load_finished)
self.webView.customContextMenuRequested.connect(self.show_context_menu)
# 应用样式
self.apply_styles()
def apply_styles(self):
"""应用样式到按钮"""
button_style = """
QPushButton {
border: none;
padding: 5px 10px;
font-family: 'Segoe UI', 'Microsoft YaHei';
font-size: 14px;
color: white;
border-radius: 5px;
background-color: #2c68c6;
}
QPushButton:hover {
background-color: #3a75d8;
}
QPushButton:pressed {
background-color: #1a56b0;
}
QPushButton:disabled {
background-color: #6c757d;
color: #adb5bd;
}
"""
nav_button_style = button_style + """
QPushButton {
background-color: #6c757d;
}
QPushButton:hover {
background-color: #5a6268;
}
QPushButton:pressed {
background-color: #495057;
}
"""
toggle_button_style = button_style + """
QPushButton {
background-color: #0d6efd;
}
QPushButton:hover {
background-color: #0b5ed7;
}
QPushButton:pressed {
background-color: #0a58ca;
}
"""
self.back_button.setStyleSheet(nav_button_style)
self.forward_button.setStyleSheet(nav_button_style)
self.reload_button.setStyleSheet(nav_button_style)
self.home_button.setStyleSheet(nav_button_style)
def go_home(self):
"""返回首页"""
self.webView.load(QUrl(self.html_path))
def update_navigation_buttons(self):
"""更新导航按钮状态"""
self.back_button.setEnabled(self.webView.history().canGoBack())
self.forward_button.setEnabled(self.webView.history().canGoForward())
def load_current_page(self):
"""加载当前连接对应的页面"""
if self.is_local_connection:
self.webView.load(QUrl(self.html_path))
else:
self.webView.load(QUrl(self.remote_url))
def on_load_finished(self, success):
"""页面加载完成后初始化开发者工具"""
if success:
# 预初始化开发者工具
self.init_dev_tools()
# 更新导航按钮状态
self.update_navigation_buttons()
def init_dev_tools(self):
"""初始化开发者工具"""
if not self.dev_tools_view:
self.dev_tools_view = DevToolsView()
self.page.setDevToolsPage(self.dev_tools_view.dev_tools_window.page())
def show_context_menu(self, pos: QPoint):
"""显示自定义右键菜单"""
# 创建上下文菜单
menu = QMenu(self)
# 添加标准浏览器动作
back_action = menu.addAction("后退")
back_action.triggered.connect(self.webView.back)
forward_action = menu.addAction("前进")
forward_action.triggered.connect(self.webView.forward)
reload_action = menu.addAction("重新加载")
reload_action.triggered.connect(self.webView.reload)
menu.addSeparator()
# 添加开发者工具相关动作
dev_tools_action = menu.addAction("打开开发者工具")
dev_tools_action.triggered.connect(self.toggle_dev_tools)
menu.addSeparator()
# 在鼠标位置显示菜单
menu.exec(self.webView.mapToGlobal(pos))
def toggle_dev_tools(self):
"""切换开发者工具窗口显示状态"""
if not self.dev_tools_view:
self.init_dev_tools()
if self.dev_tools_view is None:
return
if self.dev_tools_view.dev_tools_window.isVisible():
self.dev_tools_view.hide()
self.dev_tools_view.dev_tools_window.hide()
else:
self.dev_tools_view.show()
self.dev_tools_view.dev_tools_window.show()
self.dev_tools_view.dev_tools_window.raise_() # 将窗口置于最前
def closeEvent(self, event):
"""关闭时清理资源"""
# 停止controller中的定时器
self.controller.bridge.timer.stop()
if self.dev_tools_view:
self.dev_tools_view.close()
super().closeEvent(event)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = WebViewInterface()
window.resize(1000, 700)
window.show()
sys.exit(app.exec())