Houdini PySide2 UI避免多实例创建及PySide版本适配疑问
Houdini Python Qt 窗口单实例实现与版本问题解答
窗口重复打开问题解决方案
实现逻辑
和你在Maya中用winID校验的思路完全一致,核心是给窗口添加全局唯一标识,每次执行脚本先做存在性校验:
- 给自定义窗口类设置唯一的
objectName作为识别ID,作用等同于Maya的winID - 每次运行脚本时,先获取Houdini主窗口,查找是否存在对应ID的窗口实例
- 若存在则先关闭、销毁旧实例,再创建新实例,避免多开
修改后完整代码
import sys import webbrowser import hou from PySide2 import QtCore, QtUiTools, QtWidgets, QtGui # 自定义窗口类 class someWidget(QtWidgets.QWidget): def __init__(self): super(someWidget,self).__init__() # 设置全局唯一的objectName,用于后续实例查找 self.setObjectName("my_custom_someUI_window") ui_file = 'C:/Users/XY_Ab/Documents/houdini18.5/Folder_CGI/someUI.ui' self.ui = QtUiTools.QUiLoader().load(ui_file, parentWidget=self) self.setParent(hou.qt.mainWindow(), QtCore.Qt.Window) self.setFixedSize(437, 42) self.setWindowTitle("Requesting For Help") # 存在性校验逻辑,等同于Maya的cmds.window(exists=True)校验 hou_main_window = hou.qt.mainWindow() exist_window = hou_main_window.findChild(someWidget, "my_custom_someUI_window") if exist_window: exist_window.close() exist_window.deleteLater() # 新建并显示窗口 window_C = someWidget() window_C.show()
PySide6无法导入的原因
Houdini的UI内核是基于固定版本的Qt编译的,不同版本的Houdini内置Qt版本是绑定死的:
- 你当前使用的Houdini 18.5内置的是Qt5.x运行库,对应官方Python绑定就是PySide2
- PySide6是Qt6.x对应的Python绑定,和Houdini内置的Qt5运行库接口完全不兼容,所以导入会直接报错
- 截至Houdini 20的所有正式发行版本都仍在使用Qt5框架,除非后续Houdini官方将内核升级到Qt6,否则无法原生支持PySide6
内容的提问来源于stack exchange,提问作者AnD CGI
相关产品推荐
相关产品推荐

