こんにちは、COYOTE 3DCG STUDIO TAのやまたくです。
今回はMaya Pysideで、
QToolButtonにスタイルシート(Qt Style Sheets)を設定した際のトラブルと解決事例をご紹介します。
UI起動時にQToolButtonのbackground-colorが反映されない
QToolButtonはボタンが押されるまでbackground-color(ボタン色)が反映されません。
また、ウィンドウサイズを変更すると元に戻ってしまいます。
▼動作確認用サンプルコード
from maya.app.general import mayaMixin
from PySide2 import QtWidgets, QtGui
class MainWindow(mayaMixin.MayaQWidgetBaseMixin, QtWidgets.QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
# ツールボタンの作成
toolButton = QtWidgets.QToolButton(self)
toolButton.setText("QToolButton")
toolButton.setStyleSheet("QToolButton { background-color: red; color: yellow; }")
# プッシュボタンの作成
pushButton = QtWidgets.QPushButton("QPushButton", self)
pushButton.setStyleSheet("QPushButton { background-color: blue; color: yellow; }")
# ツールボタンとプッシュボタンを配置するためのレイアウト
layout = QtWidgets.QVBoxLayout()
layout.addWidget(toolButton)
layout.addWidget(pushButton)
# ウィジェットをセットアップし、レイアウトを適用
centralWidget = QtWidgets.QWidget()
centralWidget.setLayout(layout)
self.setCentralWidget(centralWidget)
# ウィンドウインスタンスを作成し、表示
window = MainWindow()
window.show()
下記フォーラムで同じ問題が報告されていますが、解決には至っていないようです。
https://discourse.techart.online/t/maya-ui-qtoolbutton-not-active-on-creation/11845
調べても解決策が見つからなかったので、自己流ですが解決事例のご紹介です。
background-imageを使う
background-colorではなくbackground-imageを使います。
するとUI起動時に色が反映されます。
また、ウィンドウサイズを変更しても元に戻らなくなります。
from maya.app.general import mayaMixin
from PySide2 import QtWidgets, QtGui
class MainWindow(mayaMixin.MayaQWidgetBaseMixin, QtWidgets.QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
# ツールボタンの作成
toolButton = QtWidgets.QToolButton(self)
toolButton.setText("QToolButton")
toolButton.setStyleSheet("QToolButton { background-image: url(D:/pathToImage/ButtonColor.jpg); color: yellow;}")
# プッシュボタンの作成
pushButton = QtWidgets.QPushButton("QPushButton", self)
pushButton.setStyleSheet("QPushButton { background-color: blue; color: yellow; }")
# ツールボタンとプッシュボタンを配置するためのレイアウト
layout = QtWidgets.QVBoxLayout()
layout.addWidget(toolButton)
layout.addWidget(pushButton)
# ウィジェットをセットアップし、レイアウトを適用
centralWidget = QtWidgets.QWidget()
centralWidget.setLayout(layout)
self.setCentralWidget(centralWidget)
# ウィンドウインスタンスを作成し、表示
window = MainWindow()
window.show()
D:/pathToImage/ButtonColor.jpg
ボタンが縁取りされてしまうので、
border: none;
を追加するとQPushButtonと同じようなフラットな見た目になります。
おわりに
一般的にはQPushButtonの使用で十分な場合が多いですが、
アイコン付きボタンはQToolButtonが非常に便利です。
この解決事例が、同じ問題を抱えている方々の助けになれば嬉しいです。
そして余談ですが、Maya 2025ではPySide2からPySide6への移行が行われました。
私たちCOYOTE 3DCG STUDIO は内製ツールのPySide2 to PySide6を進めています。
少なからず互換性問題がありますので、またいつか移行録をご紹介できればと考えています。
COYOTE 3DCG STUDIO
公式HP:https://3d.crdg.jp/
COYOTE 3DCG STUDIOはクリーク・アンド・リバー社が運営するゲーム専門3DCG制作集団です。
キャラモデル、背景モデル、3Dアニメーション、テクニカルアーティストによるツール開発などを得意としています。
新規立ち上げにおけるコンサルティングから量産制作まで幅広く対応可能な体制を保有しており、出向にも柔軟に対応しております。