Open4
MayaでPySideの複数バージョンに対応したPythonスクリプトを作成する覚書き
Maya 2025でQtがQt5からQt6に移行され、PySie2からPySide6へ移行されました。
今までにPySide2を使用して制作したPythonスクリプトは、Maya 2025で実行すると、インポート時にエラーが発生します。
既存のPySide2で作成したPythonスクリプトをPySide6に移行する
PySide2からインポートしていいた箇所を、PySide6に変更します。
PySide2でQtをインポートするコード
from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtUiTools import QUiLoader
Maya2025でPySide2をインポートするとエラーが発生
from PySide2.QtUiTools import QUiLoader
# エラー: ModuleNotFoundError: file <maya console> line 1: No module named 'PySide2'
インポートをPySide6からインポートするようにコードの修正が必要になります。
PySide6でQtをインポートするコード
from PySide6 import QtCore, QtGui, QtWidgets
from PySide6.QtUiTools import QUiLoader
問題点として、PySide6にコードを変更すると、同じコードではPySide2を使用する2024以前のMayaで使用するとエラーになるため、同じコードでバージョンをまたいでの仕様ができなくなります。
PySide2とPySide6の両方に対応させる
Mayaのヘルプドキュメントに、PySide2とPySIde6の両方に対応したコードのサンプルがあります。
PySide2とPySide6の両方に対応させるimport文の例(Mayaのドキュメントから引用)
try:
from PySide6.QtCore import QObject, Qt
except ImportError:
from PySide2.QtCore import QObject, Qt
try文で、どちらか片方がエラーでインポートできなかった場合に、もう片方のバージョンでインポートされるように分岐させるのがいいらしいです。
QActionのモジュールのインポート元が変更された
PySide2で、UIのなかに、QActionを作成するときは、QtWidgets.QAction
でアクセスすることができていました。PySide6では、QActionがQtGui.QAction
に変更されました。
pyuic5でQtDesignerで作成したuiファイルから変換すると、PySide2での記法であるQtWidgets.QAction
として記述されます。
try:
from PySide2 import QtCore, QtGui, QtWidgets
qaction = QtWidgets.QAction
except ImportError:
from PySide6 import QtCore, QtGui, QtWidgets
qaction = QtGui.QAction
...
class ExampleWindow(QtWidgets.QMainWindow):
def __init__(self):
self.action = qaction("Action", self)
このように、インポートのtry文の中で、qactionという変数にQActionを読みこみ、UIの処理では、定義したqactionを呼び出して使用します。
ただ、pyuic5で生成されたコードに少しだけ手を加える必要があるのが厄介です。