読者です 読者をやめる 読者になる 読者になる

Qt.pyを使ってQtDesignerのuiをMaya2017対応させる

maya python

Qt.pyとは

PySideとPySide2、PyQt4とPyQt5のコードの違いを吸収してくれるものです。
ざっくり言うと、一つのソースコードで両バージョンに対応することが出来るようになります。
fredrikaverpil.github.io

Qt.pyを導入する

PyPIに登録されているので、pipでインストールできます。

$ pip install Qt.py

Mayaで使う場合はmayapyでpipを使うなり、Githubから落としてきてPYTHONPATHに通せばおっけーです。
github.com

具体的なコード

通常PySideだとQtGuiは以下のようにインポートします。

from PySide import QtGui

Qt.pyを使う場合は、これを以下のように書き換えるだけです。

from Qt import QtGui

ただし、PySide2になってパッケージ構成が大きく変わっているので、そのあたりは注意が必要です。
たとえば、QWidgetはQtGuiの中にいましたが、PySide2ではQtWidgetsの中にいます。
したがって、QtGuiとQWidgetを使いたい場合は、以下のようにします。

from Qt import QtGui, QtWidgets
(略)
    self.horizontalLayoutWidget = QtWidgets.QWidget(Form)

QtDesignerで作ったuiをMaya2017対応させる

.uiファイルを読み込む場合は、以下のようにQtCompatというモジュールを利用します。

from Qt import QtCompat
QtCompat.load_ui(fname="my.ui")

ではpythonファイルに変換したものを使うにはどうしたらよいかというと、まずpyside2-uicで.uiを.pyに変換してやる必要があります。
pyside2が入っていない場合でも、Maya2017が入っていればMayaが持っているものを使えます。
OSXでいうと、以下のようにして.uiファイルを.pyに変換します。

$ cd /Applications/Autodesk/maya2017/Maya.app/Contents/bin
$ mayapy pyside2-uic ~/Documents/dev/qt/form.ui -o ~/Documents/dev/qt/form.py

さらに、ここで作ったform.pyをQt.pyを使って変換します。

$ python -m Qt --convert form.py
#
# WARNING: --convert is an ALPHA feature.
#
# See https://github.com/mottosso/Qt.py/pull/132
# for details.
#
Creating "form_backup.py"..
Successfully converted "form.py"

これでQt.pyで利用できるファイルが生成できました。

あとはこれを以下のような感じで読み込むだけ。

# -*- coding: utf-8 -*-
from __future__ import absolute_import, division, print_function
from maya import OpenMayaUI as omui
 
try:
    from shiboken import wrapInstance
except ImportError:
    from shiboken2 import wrapInstance
from Qt import QtGui, QtWidgets
 
from ui import qt_test
 
 
class QtTestWindow(QtWidgets.QMainWindow, qt_test.Ui_Form):
    def __init__(self, parent=None, *args, **kwargs):
        super(QtTestWindow, self).__init__(parent)
        self.setupUi(self)
 
 
def maya_main_window():
    maya_mainwindow_ptr = omui.MQtUtil.mainWindow()
 
    return wrapInstance(long(maya_mainwindow_ptr), QtWidgets.QMainWindow)
 
 
def main(*args):
    dialog = QtTestWindow(maya_main_window())
    dialog.show()

すてき…!

shibokenのところはもうちょっとなんとか出来るかもしれません。
手が空いたときにたぶん…もうちょっと…詳しく…!

スポンサーリンク