PyQt および PySide ウィジェットのベスト プラクティス

ウィジェットへのリファレンスの維持

![](../../images/Updated _Odd-to-Even.png)

PyQt5 または PySide2 を使用して Maya のユーザ インタフェースをカスタマイズする場合は、Maya のメイン ウィンドウなど、既存の Maya ウィジェットの下に自分のウィジェットをペアレント化してください。ウィジェットがペアレント化されていないと、ウィジェットへのリファレンスが維持されていない場合、Python インタプリタのガベージ コレクターによってウィジェットが破棄される場合があります。

このベスト プラクティスのコード例を次に示します。PySide2 の代わりに、PyQt5 モジュールを読み込んだ場合も、このコードは機能することに注意してください。

from maya import OpenMayaUI as omui 

from PySide2.QtCore import * 
from PySide2.QtGui import * 
from PySide2.QtWidgets import *
from PySide2 import __version__
from shiboken2 import wrapInstance 

mayaMainWindowPtr = omui.MQtUtil.mainWindow() 
mayaMainWindow= wrapInstance(long(mayaMainWindowPtr), QWidget) 

# WORKS: Widget is fine 
hello = QLabel("Hello, World", parent=mayaMainWindow) 
hello.setObjectName('MyLabel') 
hello.setWindowFlags(Qt.Window) # Make this widget a standalone window even though it is parented 
hello.show() 
hello = None # the "hello" widget is parented, so it will not be destroyed. 

# BROKEN: Widget is destroyed 
hello = QLabel("Hello, World", parent=None) 
hello.setObjectName('MyLabel') 
hello.show() 
hello = None # the "hello" widget is not parented, so it will be destroyed.

maya.app.general.mayaMixin クラスの使用

Maya ワークスペースと互換性のある PyQt ウィジェットおよび PySide ウィジェットの記述方法の詳細については、「ワークスペース コントロールを記述する」を参照してください。