Maya Qt窗口父子关系设置指南
2024年11月3日
本文介绍如何在Maya中使用Qt设置窗口的父子关系,实现窗口置顶等功能。
Qt窗口基础模板
基本概念
在Maya中使用Qt设置窗口父子关系主要需要:
- 获取Maya主窗口作为父窗口
- 设置正确的窗口标志(Window Flags)
- 管理窗口实例
核心代码
import maya.cmds as cmds
from PySide2 import QtWidgets, QtCore
import maya.OpenMayaUI as omui
from shiboken2 import wrapInstance
def maya_main_window():
"""
获取Maya主窗口作为父窗口
功能:
- 使用OpenMayaUI获取Maya主窗口指针
- 通过shiboken2将Maya窗口指针转换为Qt窗口对象
返回:
- QtWidgets.QWidget: Maya主窗口的Qt对象
"""
main_window_ptr = omui.MQtUtil.mainWindow()
return wrapInstance(int(main_window_ptr), QtWidgets.QWidget)
class ExampleWindow(QtWidgets.QDialog):
def __init__(self, parent=None):
super(ExampleWindow, self).__init__(parent)
# 设置窗口标题
self.setWindowTitle("Example Window")
# 设置窗口标志
self.setWindowFlags(self.windowFlags() |
QtCore.Qt.Tool |
QtCore.Qt.WindowStaysOnTopHint)
# 创建UI
self.create_widgets()
self.create_layouts()
def create_widgets(self):
self.test_button = QtWidgets.QPushButton("Test Button")
def create_layouts(self):
main_layout = QtWidgets.QVBoxLayout(self)
main_layout.addWidget(self.test_button)
def show():
"""
显示窗口的函数
功能:
- 关闭已存在的窗口实例
- 创建新窗口并显示
"""
global example_window
try:
example_window.close()
example_window.deleteLater()
except:
pass
parent = maya_main_window()
example_window = ExampleWindow(parent)
example_window.show()
example_window.raise_()
example_window.activateWindow()
关键功能说明
- 窗口标志设置
self.setWindowFlags(self.windowFlags() |
QtCore.Qt.Tool |
QtCore.Qt.WindowStaysOnTopHint)
QtCore.Qt.Tool
: 使窗口保持在Maya主窗口之上QtCore.Qt.WindowStaysOnTopHint
: 使窗口始终置顶
- 窗口实例管理
def show():
global example_window
try:
example_window.close()
example_window.deleteLater()
except:
pass
parent = maya_main_window()
example_window = ExampleWindow(parent)
example_window.show()
PS
- 窗口标志选择
QtCore.Qt.Tool
: 基本的置顶功能WindowStaysOnTopHint
: 始终置顶 (可以选则性不要,这个是windows全局置顶)FramelessWindowHint
: 无边框窗口(需要时使用)
- 父子关系管理
- 始终使用Maya主窗口作为父窗口
- 正确关闭和清理窗口实例
- 使用全局变量管理窗口实例