#!/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 QPanda3D.QPanda3DWidget import QPanda3DWidget from QPanda3D.Panda3DWorld import Panda3DWorld from panda3d.core import * from direct.task import Task class SizeTestWorld(Panda3DWorld): def __init__(self): super().__init__() print("=== Qt窗口尺寸测试 ===") self.setBackgroundColor(0.2, 0.2, 0.3) # Qt部件引用 self.qtWidget = None # 启动定时检查任务 self.taskMgr.doMethodLater(2.0, self.checkSizes, "check-sizes") def setQtWidget(self, widget): """设置Qt部件引用""" self.qtWidget = widget print(f"✓ 设置Qt部件引用: {widget}") print(f" Qt部件类型: {type(widget)}") def getWindowSize(self): """获取准确的窗口尺寸""" if self.qtWidget: # 优先使用Qt部件的实际尺寸 width, height = self.qtWidget.getActualSize() if width > 0 and height > 0: print(f"✓ 从Qt部件获取窗口尺寸: {width} x {height}") return width, height # 备用方案:使用Panda3D窗口尺寸 if hasattr(self, 'win') and self.win: width = self.win.getXSize() height = self.win.getYSize() print(f"⚠ 从Panda3D窗口获取尺寸: {width} x {height}") return width, height # 最后的默认值 print("⚠ 使用默认窗口尺寸: 800 x 600") return 800, 600 def checkSizes(self, task): """检查各种尺寸获取方法的结果""" print("\n=== 窗口尺寸对比测试 ===") # 方法1:从Qt部件获取 if self.qtWidget: qt_width, qt_height = self.qtWidget.getActualSize() print(f"Qt部件尺寸: {qt_width} x {qt_height}") else: print("Qt部件尺寸: 未设置") # 方法2:从Panda3D窗口获取 if hasattr(self, 'win') and self.win: panda_width = self.win.getXSize() panda_height = self.win.getYSize() print(f"Panda3D窗口尺寸: {panda_width} x {panda_height}") else: print("Panda3D窗口尺寸: 无效") # 方法3:使用新的getWindowSize方法 final_width, final_height = self.getWindowSize() print(f"最终使用尺寸: {final_width} x {final_height}") # 检查是否有差异 if self.qtWidget and hasattr(self, 'win') and self.win: qt_width, qt_height = self.qtWidget.getActualSize() panda_width = self.win.getXSize() panda_height = self.win.getYSize() if qt_width != panda_width or qt_height != panda_height: print(f"⚠ 发现尺寸差异!Qt: {qt_width}x{qt_height}, Panda3D: {panda_width}x{panda_height}") print("这就是之前坐标轴点击检测失败的原因!") else: print("✓ 尺寸一致,没有问题") # 每5秒检查一次 return task.again class CustomSizeTestWidget(QPanda3DWidget): """支持尺寸获取的测试部件""" def __init__(self, world, parent=None): super().__init__(world, parent) self.world = world # 让world引用这个widget if hasattr(world, 'setQtWidget'): world.setQtWidget(self) def getActualSize(self): """获取Qt部件的实际渲染尺寸""" return (self.width(), self.height()) def resizeEvent(self, event): """处理窗口大小改变事件""" super().resizeEvent(event) print(f"\n窗口大小改变: {self.width()} x {self.height()}") # 触发新的尺寸检查 if hasattr(self.world, 'checkSizes'): self.world.taskMgr.doMethodLater(0.1, self.world.checkSizes, "check-sizes-after-resize") def main(): print("启动Qt窗口尺寸测试...") app = QApplication(sys.argv) # 创建主窗口 mainWindow = QMainWindow() mainWindow.setWindowTitle("Qt窗口尺寸测试 - 坐标轴修复验证") mainWindow.setGeometry(100, 100, 900, 700) # 设置一个明确的大小 # 创建布局 centralWidget = QWidget() layout = QVBoxLayout(centralWidget) # 添加说明 label = QLabel("Qt窗口尺寸测试 - 查看控制台输出") label.setAlignment(Qt.AlignCenter) label.setStyleSheet("background-color: lightgreen; padding: 10px; font-size: 14px;") layout.addWidget(label) # 创建世界 world = SizeTestWorld() # 创建测试部件 pandaWidget = CustomSizeTestWidget(world) layout.addWidget(pandaWidget) mainWindow.setCentralWidget(centralWidget) mainWindow.show() print("\n测试说明:") print("1. 程序会每5秒检查一次窗口尺寸") print("2. 尝试调整窗口大小,观察尺寸变化") print("3. 如果Qt尺寸和Panda3D尺寸不同,说明修复有效") print("4. 如果尺寸一致,说明你的环境没有这个问题") return app.exec_() if __name__ == "__main__": sys.exit(main())