如何在Siemens NX Python插件中调用嵌入式Qt的.dll库开发UI?
使用NXOpen Python调用NX内置Qt库开发UI插件的实现方案
作为长期用NXOpen做二次开发的开发者,我非常熟悉你遇到的场景——NX确实依赖定制化的Qt库(也就是你看到的Qt5GuiNX.dll、Qt5CoreNX.dll这类文件),直接用普通PyQt/PySide会出现版本冲突,而且不符合插件的轻量化安装要求。下面是经过验证的可靠实现步骤:
核心原则:依赖NX自带环境,避免额外打包
NX启动时会自动加载自身的环境变量和库文件,所以我们的插件必须完全依托NX的内置Python解释器和Qt库,不需要单独打包Qt组件,这样能完美满足安装要求。
步骤1:确认开发环境
必须使用NX安装目录下的Python解释器进行开发,路径一般是:
<NX安装路径>\UGII\python\python.exe
比如NX 2306的默认路径是C:\Program Files\Siemens\NX 2306\UGII\python\python.exe。用这个解释器运行脚本,能自动识别NX的Qt库路径,避免手动配置的麻烦。
步骤2:用NXOpen.Qt集成Qt界面
NXOpen提供了专门的Qt加载接口,能直接加载Qt Designer制作的.ui文件,且自动复用NX的Qt库,是最稳妥的方式:
示例代码:
import os import NXOpen import NXOpen.Qt def show_custom_ui(): # 获取NX会话和UI对象 the_session = NXOpen.Session.GetSession() the_ui = the_session.UI # 加载Qt Designer导出的UI文件 ui_loader = NXOpen.Qt.UiLoader() # 替换为你的UI文件路径,建议和脚本同目录 ui_file_path = os.path.join(os.path.dirname(__file__), "custom_ui.ui") try: widget = ui_loader.LoadUi(ui_file_path) except Exception as e: the_ui.NXMessageBox.Show("错误", NXOpen.NXMessageBox.DialogType.Error, f"加载UI失败:{str(e)}") return # 将UI嵌入NX的对话框中显示 dialog = the_ui.CreateDialog(widget) dialog.Show() # 启动UI if __name__ == "__main__": show_custom_ui()
步骤3:处理自定义逻辑(信号槽)
如果需要给UI控件添加交互逻辑,比如按钮点击事件,可以通过NXOpen.Qt的信号槽机制实现,示例:
# 假设你的UI中有一个名为pushButton的按钮 push_button = widget.findChild(NXOpen.Qt.QPushButton, "pushButton") def on_button_clicked(): the_ui.NXMessageBox.Show("提示", NXOpen.NXMessageBox.DialogType.Information, "按钮被点击了!") # 绑定信号槽 push_button.clicked.connect(on_button_clicked)
步骤4:插件打包与安装
为了满足安装要求,推荐将脚本、UI文件和资源文件打包成NX标准插件包(.nxpk):
- 创建一个包含所有文件的文件夹,结构示例:
MyCustomPlugin/ ├── custom_ui.ui ├── main.py └── plugin.json # 插件配置文件,定义插件名称、加载方式等 - 使用NX的
Plugin Builder或者手动打包成.nxpk文件(本质是zip压缩包,改后缀为.nxpk) - 用户安装时,只需将
.nxpk文件放到NX的插件目录(默认是C:\Program Files\Siemens\NX <版本>\UGII\plugins),或者通过NX的File->Options->Plugins界面加载。
关键注意事项
- 绝对不要使用独立的PyQt5/PySide2库,否则会和NX的定制Qt库发生版本冲突,导致NX崩溃
- 所有测试必须在NX内部进行(通过
File->Execute->Python Script运行),外部Python环境无法正确加载NX的Qt库 - 不要尝试手动加载
Qt5GuiNX.dll这类文件,NXOpen的Qt接口已经封装了所有必要的调用,直接使用即可
内容的提问来源于stack exchange,提问作者Anton




