windows临时web

This commit is contained in:
Hector 2025-12-05 15:17:27 +08:00
parent 2776c587c1
commit 4f6c6bee7d

View File

@ -1,4 +1,5 @@
"""

"""
主窗口设置模块
负责主窗口的界面构建和事件绑定
@ -10,7 +11,18 @@ import os
import sys
from PyQt5.QtGui import QKeySequence, QIcon, QPalette, QColor
# from PyQt5.QtWebEngineWidgets import QWebEngineView
# QtWebEngine 导入(环境变量已在 main.py 中配置)
try:
from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEngineSettings
WEB_ENGINE_AVAILABLE = True
print("✓ QtWebEngineWidgets 已导入")
except ImportError:
WEB_ENGINE_AVAILABLE = False
QWebEngineView = None
from PyQt5.QtWidgets import (QApplication, QMainWindow, QMenuBar, QMenu, QAction,
QDockWidget, QTreeWidget, QListWidget, QWidget, QVBoxLayout, QTreeWidgetItem,
QLabel, QLineEdit, QFormLayout, QDoubleSpinBox, QScrollArea,
@ -1504,7 +1516,12 @@ class MainWindow(QMainWindow):
self.createSamplePanelAction.triggered.connect(self.world.info_panel_manager.onCreateSampleInfoPanel)
self.create3DSamplePanelAction.triggered.connect(self.onCreate3DSampleInfoPanel)
self.webBrowserAction.triggered.connect(self.openWebBrowser)
if sys.platform == 'win32':
self.webBrowserAction.triggered.connect(self.openWebBrowser_win)
else:
self.webBrowserAction.triggered.connect(self.openWebBrowser)
def getCreateMenuActions(self):
"""获取所有创建菜单动作的字典 - 供右键菜单使用"""
@ -2290,90 +2307,90 @@ class MainWindow(QMainWindow):
self.bottomDock.setWidget(bottomDockContainer)
self.addDockWidget(Qt.BottomDockWidgetArea, self.bottomDock)
# 创建底部停靠控制台
self.consoleDock = QDockWidget("控制台", self)
self.consoleDock.setStyleSheet("""
QDockWidget {
background-color: #19191b;
color: #ffffff;
border: none;
}
QDockWidget::title {
background-color: #19191b;
padding: 8px 10px;
border-bottom: none;
text-align: left;
font-family: 'Microsoft YaHei', 'Inter', sans-serif;
font-size: 14px;
font-weight: 500;
}
QDockWidget::close-button {
background-color: rgba(89, 100, 113, 0.3);
border: 1px solid rgba(184, 211, 241, 0.2);
icon-size: 10px;
border-radius: 2px;
width: 16px;
height: 16px;
right: 6px;
top: 6px;
}
QDockWidget::float-button {
background-color: rgba(89, 100, 113, 0.3);
border: 1px solid rgba(184, 211, 241, 0.2);
icon-size: 10px;
border-radius: 2px;
width: 16px;
height: 16px;
right: 26px;
top: 6px;
}
QDockWidget::close-button:hover, QDockWidget::float-button:hover {
background-color: rgba(89, 100, 113, 0.5);
border: 1px solid rgba(184, 211, 241, 0.3);
}
QDockWidget::close-button:pressed, QDockWidget::float-button:pressed {
background-color: #3067c0;
border: 1px solid rgba(48, 103, 192, 0.6);
}
""")
self.consoleView = CustomConsoleDockWidget(self.world)
# 为控制台添加样式
self.consoleView.setStyleSheet("""
QTextEdit {
background-color: #19191b;
color: #ebebeb;
border: none;
font-family: 'Consolas', 'Monaco', 'Microsoft YaHei', monospace;
font-size: 10px;
font-weight: 300;
}
""")
# 创建包装容器,添加标题下方的分隔线
consoleDockContainer = QWidget()
consoleDockContainer.setStyleSheet("QWidget { background-color: #19191b; }")
consoleDockLayout = QVBoxLayout(consoleDockContainer)
consoleDockLayout.setContentsMargins(0, 0, 0, 0)
consoleDockLayout.setSpacing(0)
# 添加带左右间距的分隔线
consoleSeparator = QFrame()
consoleSeparator.setFrameShape(QFrame.HLine)
consoleSeparator.setFrameShadow(QFrame.Plain)
consoleSeparator.setStyleSheet("""
QFrame {
background-color: rgba(77, 116, 189, 0.4);
max-height: 1px;
margin-left: 8px;
margin-right: 8px;
border: none;
}
""")
consoleDockLayout.addWidget(consoleSeparator)
consoleDockLayout.addWidget(self.consoleView)
self.consoleDock.setWidget(consoleDockContainer)
self.addDockWidget(Qt.BottomDockWidgetArea, self.consoleDock)
# # 创建底部停靠控制台
# self.consoleDock = QDockWidget("控制台", self)
# self.consoleDock.setStyleSheet("""
# QDockWidget {
# background-color: #19191b;
# color: #ffffff;
# border: none;
# }
# QDockWidget::title {
# background-color: #19191b;
# padding: 8px 10px;
# border-bottom: none;
# text-align: left;
# font-family: 'Microsoft YaHei', 'Inter', sans-serif;
# font-size: 14px;
# font-weight: 500;
# }
# QDockWidget::close-button {
# background-color: rgba(89, 100, 113, 0.3);
# border: 1px solid rgba(184, 211, 241, 0.2);
# icon-size: 10px;
# border-radius: 2px;
# width: 16px;
# height: 16px;
# right: 6px;
# top: 6px;
# }
# QDockWidget::float-button {
# background-color: rgba(89, 100, 113, 0.3);
# border: 1px solid rgba(184, 211, 241, 0.2);
# icon-size: 10px;
# border-radius: 2px;
# width: 16px;
# height: 16px;
# right: 26px;
# top: 6px;
# }
# QDockWidget::close-button:hover, QDockWidget::float-button:hover {
# background-color: rgba(89, 100, 113, 0.5);
# border: 1px solid rgba(184, 211, 241, 0.3);
# }
# QDockWidget::close-button:pressed, QDockWidget::float-button:pressed {
# background-color: #3067c0;
# border: 1px solid rgba(48, 103, 192, 0.6);
# }
# """)
# self.consoleView = CustomConsoleDockWidget(self.world)
# # 为控制台添加样式
# self.consoleView.setStyleSheet("""
# QTextEdit {
# background-color: #19191b;
# color: #ebebeb;
# border: none;
# font-family: 'Consolas', 'Monaco', 'Microsoft YaHei', monospace;
# font-size: 10px;
# font-weight: 300;
# }
# """)
#
# # 创建包装容器,添加标题下方的分隔线
# consoleDockContainer = QWidget()
# consoleDockContainer.setStyleSheet("QWidget { background-color: #19191b; }")
# consoleDockLayout = QVBoxLayout(consoleDockContainer)
# consoleDockLayout.setContentsMargins(0, 0, 0, 0)
# consoleDockLayout.setSpacing(0)
#
# # 添加带左右间距的分隔线
# consoleSeparator = QFrame()
# consoleSeparator.setFrameShape(QFrame.HLine)
# consoleSeparator.setFrameShadow(QFrame.Plain)
# consoleSeparator.setStyleSheet("""
# QFrame {
# background-color: rgba(77, 116, 189, 0.4);
# max-height: 1px;
# margin-left: 8px;
# margin-right: 8px;
# border: none;
# }
# """)
# consoleDockLayout.addWidget(consoleSeparator)
# consoleDockLayout.addWidget(self.consoleView)
#
# self.consoleDock.setWidget(consoleDockContainer)
# self.addDockWidget(Qt.BottomDockWidgetArea, self.consoleDock)
# 配置Dock区域的角落归属
# 使右侧和下侧的Dock面板可以占据右下角区域
@ -2397,7 +2414,7 @@ class MainWindow(QMainWindow):
# 确保其他面板也正常显示
self.bottomDock.raise_()
self.consoleDock.raise_()
#self.consoleDock.raise_()
self.leftDock.raise_()
# =========================================================================
# ↓↓↓ 为停靠窗口的标签栏QTabBar设置统一样式根据Figma设计↓↓↓
@ -3912,11 +3929,70 @@ class MainWindow(QMainWindow):
self.world.setCurrentTool(None)
print("工具栏: 取消选择工具")
# def openWebBrowser_win(self):
# """
# 使用 QMainWindow 窗口显示网页
# 创建独立的 Web 浏览器窗口
# """
# from PyQt5.QtWidgets import QMainWindow, QVBoxLayout, QWidget
# from PyQt5.QtWebEngineWidgets import QWebEngineView
# from PyQt5.QtCore import QUrl
#
# # 创建独立的浏览器窗口
# window = QMainWindow(self)
# window.setWindowTitle("Web浏览器")
# window.setGeometry(100, 100, 1024, 768)
#
# # 创建中央部件和布局
# central_widget = QWidget()
# window.setCentralWidget(central_widget)
# layout = QVBoxLayout(central_widget)
#
# # 创建 WebEngine 视图
# web_view = QWebEngineView()
# web_view.load(QUrl("https://www.baidu.com"))
#
# # 添加到布局
# layout.addWidget(web_view)
#
# # 显示窗口
# window.show()
def openWebBrowser_win(self):
"""
在独立进程中运行Web浏览器无终端窗口
避免与Panda3D的OpenGL上下文冲突
"""
import subprocess
import sys
import os
# 获取当前脚本目录
current_dir = os.path.dirname(os.path.abspath(__file__))
browser_script = os.path.join(current_dir, '..', 'standalone_web_browser.py')
# 在独立进程中启动Web浏览器不创建终端窗口
try:
if sys.platform == "win32":
subprocess.Popen([sys.executable, browser_script],
creationflags=subprocess.CREATE_NO_WINDOW)
else:
subprocess.Popen([sys.executable, browser_script])
print("✓ 独立Web浏览器已在后台启动")
except Exception as e:
print(f"✗ 启动独立Web浏览器失败: {e}")
# 如果启动失败,则使用系统默认浏览器作为备选方案
import webbrowser
webbrowser.open("https://www.baidu.com")
QWebEngineSettings = None
print("⚠ QtWebEngineWidgets 未找到Web 浏览器功能将不可用")
def openWebBrowser(self):
if not WEB_ENGINE_AVAILABLE:
return None
try:
from PyQt5.QtWebEngineWidgets import QWebEngineView
#from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtWidgets import QDockWidget
from PyQt5.QtCore import QUrl
import os
@ -3975,8 +4051,8 @@ class MainWindow(QMainWindow):
self.web_view = QWebEngineView()
# 加载百度网页
#print("🌐 加载百度网页: https://www.baidu.com")
#self.web_view.load(QUrl("https://www.bootstrapmb.com/item/15762/preview"))
# print("🌐 加载百度网页: https://www.baidu.com")
# self.web_view.load(QUrl("https://www.bootstrapmb.com/item/15762/preview"))
self.web_view.load(QUrl("https://www.baidu.com"))
# 设置内容
@ -3999,7 +4075,6 @@ class MainWindow(QMainWindow):
return None
def getSampleWeatherData(self):
"""获取示例天气数据"""
try: