EG/demo/test_qt_debug.py
2025-12-12 16:16:15 +08:00

237 lines
8.2 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.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Qt环境深度调试
诊断Qt集成环境中的渲染问题
"""
import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning)
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QLabel
from PyQt5.QtCore import Qt
from QMeta3D.QMeta3DWidget import QMeta3DWidget
from QMeta3D.Meta3DWorld import Meta3DWorld
from direct.gui.DirectGui import *
from direct.gui.OnscreenText import OnscreenText
from panda3d.core import *
import os
class DebugGUIWorld(Meta3DWorld):
def __init__(self):
super().__init__()
print("=== 开始Qt环境调试 ===")
# 设置背景色
self.setBackgroundColor(0.2, 0.2, 0.3)
print("背景色设置完成")
# 检查基本渲染状态
print(f"render节点: {self.render}")
print(f"render2d节点: {self.render2d}")
print(f"主相机: {self.cam}")
print(f"2D相机: {self.camera2d}")
# 检查图形状态
print(f"图形引擎: {self.graphicsEngine}")
if hasattr(self, 'win'):
print(f"主窗口: {self.win}")
print(f"窗口大小: {self.win.getXSize()} x {self.win.getYSize()}")
# 创建一个简单的3D几何体测试
self.create3DTest()
# 延迟创建2D GUI
self.taskMgr.doMethodLater(1.0, self.create2DTest, "create-2d-test")
def create3DTest(self):
"""创建3D测试内容"""
print("\n--- 创建3D测试内容 ---")
# 创建一个简单的立方体
from panda3d.core import CardMaker
cm = CardMaker("test-cube")
cm.setFrame(-1, 1, -1, 1)
self.testCube = self.render.attachNewNode(cm.generate())
self.testCube.setPos(0, 5, 0)
self.testCube.setColor(1, 0, 0, 1) # 红色
print(f"3D立方体创建: {self.testCube}")
print(f"立方体位置: {self.testCube.getPos()}")
# 创建3D文本
textNode = TextNode('3d-debug-text')
textNode.setText("3D Test")
textNode.setAlign(TextNode.ACenter)
self.text3D = self.render.attachNewNode(textNode)
self.text3D.setPos(0, 3, 2)
self.text3D.setScale(0.5)
self.text3D.setColor(1, 1, 0, 1) # 黄色
self.text3D.setBillboardAxis()
print(f"3D文本创建: {self.text3D}")
# 添加基础光照
alight = AmbientLight('debug-alight')
alight.setColor((0.3, 0.3, 0.3, 1))
alnp = self.render.attachNewNode(alight)
self.render.setLight(alnp)
dlight = DirectionalLight('debug-dlight')
dlight.setColor((0.8, 0.8, 0.8, 1))
dlnp = self.render.attachNewNode(dlight)
dlnp.setHpr(45, -45, 0)
self.render.setLight(dlnp)
print("光照设置完成")
def create2DTest(self, task=None):
"""创建2D测试内容"""
print("\n--- 创建2D测试内容 ---")
# 检查2D渲染状态
print(f"render2d: {self.render2d}")
print(f"aspect2d: {self.aspect2d}")
print(f"camera2d: {self.camera2d}")
print(f"camera2d位置: {self.camera2d.getPos()}")
print(f"camera2d朝向: {self.camera2d.getHpr()}")
# 创建屏幕文本
try:
self.screenText = OnscreenText(
text="2D Screen Test",
pos=(0, 0.8),
scale=0.1,
fg=(1, 1, 1, 1),
align=TextNode.ACenter
)
print(f"屏幕文本创建成功: {self.screenText}")
print(f"屏幕文本父节点: {self.screenText.getParent()}")
except Exception as e:
print(f"屏幕文本创建失败: {str(e)}")
# 创建DirectGUI按钮
try:
self.testButton = DirectButton(
text="Test Button",
pos=(0, 0, 0),
scale=0.15,
frameColor=(1, 0, 0, 1), # 红色背景
text_fg=(1, 1, 1, 1), # 白色文字
command=self.onButtonClick
)
print(f"DirectGUI按钮创建成功: {self.testButton}")
print(f"按钮父节点: {self.testButton.getParent()}")
print(f"按钮位置: {self.testButton.getPos()}")
print(f"按钮隐藏状态: {self.testButton.isHidden()}")
except Exception as e:
print(f"DirectGUI按钮创建失败: {str(e)}")
# 创建DirectGUI标签
try:
self.testLabel = DirectLabel(
text="Test Label",
pos=(0, 0, -0.3),
scale=0.1,
frameColor=(0, 1, 0, 1), # 绿色背景
text_fg=(0, 0, 0, 1) # 黑色文字
)
print(f"DirectGUI标签创建成功: {self.testLabel}")
except Exception as e:
print(f"DirectGUI标签创建失败: {str(e)}")
# 检查aspect2d的所有子节点
print(f"\naspect2d子节点总数: {self.aspect2d.getNumChildren()}")
for i in range(self.aspect2d.getNumChildren()):
child = self.aspect2d.getChild(i)
print(f" 子节点 {i}: {child.getName()} - {child}")
# 检查渲染状态
self.checkRenderState()
return task.done if task else None
def checkRenderState(self):
"""检查渲染状态"""
print("\n--- 检查渲染状态 ---")
# 检查显示区域
if hasattr(self, 'win') and self.win:
print(f"窗口有效: {self.win.isValid()}")
print(f"窗口活跃: {self.win.isActive()}")
print(f"窗口大小: {self.win.getXSize()} x {self.win.getYSize()}")
# 检查显示区域
for i in range(self.win.getNumDisplayRegions()):
dr = self.win.getDisplayRegion(i)
print(f"显示区域 {i}: {dr}")
print(f" 相机: {dr.getCamera()}")
print(f" 激活状态: {dr.isActive()}")
print(f" 维度: {dr.getDimensions()}")
# 强制渲染一帧
try:
if hasattr(self, 'graphicsEngine'):
self.graphicsEngine.renderFrame()
print("强制渲染帧完成")
except Exception as e:
print(f"强制渲染失败: {str(e)}")
def onButtonClick(self):
"""按钮点击事件"""
print("✓ 按钮被点击了!")
class DebugWidget(QMeta3DWidget):
def __init__(self, world, parent=None):
super().__init__(world, parent)
self.world = world
print(f"Qt部件初始化完成: {self}")
def main():
"""主函数"""
print("启动Qt环境深度调试...")
app = QApplication(sys.argv)
# 创建主窗口
mainWindow = QMainWindow()
mainWindow.setWindowTitle("Qt环境深度调试")
mainWindow.setGeometry(100, 100, 800, 600)
# 创建布局和容器
centralWidget = QWidget()
layout = QVBoxLayout(centralWidget)
# 添加状态标签
statusLabel = QLabel("Qt环境调试 - 查看控制台输出")
statusLabel.setAlignment(Qt.AlignCenter)
statusLabel.setStyleSheet("background-color: lightblue; padding: 10px;")
layout.addWidget(statusLabel)
# 创建调试世界
world = DebugGUIWorld()
# 创建Panda3D部件
pandaWidget = DebugWidget(world)
layout.addWidget(pandaWidget)
mainWindow.setCentralWidget(centralWidget)
# 显示窗口
mainWindow.show()
print("调试窗口已显示")
print("如果看到红色立方体和黄色3D文本说明3D渲染正常")
print("如果看到红色按钮和绿色标签说明2D GUI渲染正常")
print("如果窗口是黑色的,说明存在渲染问题")
# 运行应用
return app.exec_()
if __name__ == "__main__":
exit_code = main()