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のところはもうちょっとなんとか出来るかもしれません。
手が空いたときにたぶん…もうちょっと…詳しく…!