先日、Amaterasuに実装した、標準の起動画面を出してからオリジナルの画像に切替える方法です!
準備
まず、PySideでSplash Screenを変更するには、なんとかしてwidgetにアクセスするためのオブジェクトをゲットする必要があります(´・ω・`)
MayaはQtで作られるようになったので、「スタンドアローンなQtのアプリケーションの作り方とほぼ同等なのでは?」っと憶測しました。
そこで、QApplicationのインスタンスが格納されている変数「QtWidgets.qApp」から、Maya起動時のWidgetを調べてみることにしました(`・ω・´)ゞ
「userSetup.py」に下記のコードを実行して結果を見てみます。
from PySide2 import QtCore, QtWidgets, QtGui widgets = QtWidgets.qApp.topLevelWidgets() for widget in widgets: print widget
すると、、、
<PySide2.QtWidgets.QWidget object at 0x0000028423AB05C8> <PySide2.QtWidgets.QWidget object at 0x0000028423AB0608> <PySide2.QtWidgets.QSplashScreen object at 0x0000028423AB0648>
「QWidget」のインスタンス2つと、「QSplashScreen」のインスタンス1つが生成されていることがわかりました!(*´ω`*)
どうやらカスタマイズした「QSplashScreen」でないようなので、もう楽勝ですね!!「isinstance」を使って必要なデータを取り出しておきます。
from PySide2 import QtCore, QtWidgets, QtGui splashScreen = None widgets = QtWidgets.qApp.topLevelWidgets() for widget in widgets: if isinstance(widget, QtWidgets.QSplashScreen): splashScreen = widget break
QSplashScreenのメソッドで画像変更
インスタンスをゲットできたので、「setPixmap」を使って画像を設定します!
from PySide2 import QtCore, QtWidgets, QtGui splashScreen = None widgets = QtWidgets.qApp.topLevelWidgets() for widget in widgets: if isinstance(widget, QtWidgets.QSplashScreen): splashScreen = widget break if splashScreen: pixmap = QtGui.QPixmap('画像パス') splashScreen.setPixmap(pixmap)
起動して確認してみます!
できたー!っと思ったのですが、よーく見るとMayaのバージョン情報が消滅してしまいました・・・
どうやら内部で画像にバージョン情報を合成して表示しているようですね(´;ω;`)
画像にバージョン情報の合成
Splash Screenに記載されている形式のバージョン情報は、Mayaコマンド「cmds.about(iv=True)」で取得することができるのでこれを合成していきます。
PySideで画像に字を書きたい場合は、「QPainter」を用意して「drawText」を使います。ここではなるべく見た目を合わせるために、「setFont」でフォントやサイズの設定をしました(`・ω・´)ゞ
from PySide2 import QtCore, QtWidgets, QtGui from maya import cmds splashScreen = None widgets = QtWidgets.qApp.topLevelWidgets() for widget in widgets: if isinstance(widget, QtWidgets.QSplashScreen): splashScreen = widget break if splashScreen: pixmap = QtGui.QPixmap('画像パス') painter = QtGui.QPainter() painter.begin(pixmap) painter.setFont(QtGui.QFont('Arial', 8, QtGui.QFont.Bold)) painter.drawText(QtCore.QPoint(5, 480), cmds.about(iv=True)) painter.end() splashScreen.setPixmap(pixmap)
起動して、確認すると意図した状態にすることができました!
すっかりご無沙汰BLOGになってしまいました・・・(´;ω;`)