maya でツール作ってる人なら共感出来ると思うのですが
QtGui に FrameLayout(※) が無いんです|ω・`)
なんで無いんですか
なんで無いんですか!
…と、同じこと何度も言ってても仕方が無いので、無いものは作ればいいんです!
※FrameLaout:タイトルバーを押すと中身のUIを開閉出来るので mayaUI で多用されるかなり便利な部品
QtGui に FrameLayout(※) が無いんです|ω・`)
なんで無いんですか
なんで無いんですか!
…と、同じこと何度も言ってても仕方が無いので、無いものは作ればいいんです!
※FrameLaout:タイトルバーを押すと中身のUIを開閉出来るので mayaUI で多用されるかなり便利な部品
●QtDesigner でレイアウト
以下の画像のように、押すと開閉出来るボタンは QToolButton で、
開閉される中身は QFrame で作り、QVBoxLaout で並べて置きます
それ以外は好きなものを詰め込んでください
※この例では解説用にマージンがかなり多めに付けてありますが、適度に調整してください
なぜ QToolButton を使うかというと、QPushButton には無い Arrow(矢印アイコン)が出せるからです
プロパティエディタでこのように設定してあげてください
アイコンサイズはデフォルトだとでかいからですw
●FrameLayout のクラスを作る
開閉する操作は QtDesigner のシグナル設定だけだと難しいので自前で書きます
といっても、基本的な動作は数行で済みます
といっても、基本的な動作は数行で済みます
# -*- coding: utf-8 -*- import os import sys from PySide import QtCore, QtGui from PySide.QtUiTools import QUiLoader CURRENT_PATH = os.path.dirname(__file__) #---------------------------------------------------------------------------- ## FrameLayoutを作るクラス class FrameLayout(object): def __init__(self, titleBar, frame): self.titleBar = titleBar # 上のボタンウィジェット self.frame = frame # 開閉するウィジェット self.collapse = False # 開閉している状態フラグ self.setSignals() # シグナルをセット #------------------------------------------------------------------------- ## シグナルを設定する def setSignals(self): self.titleBar.clicked.connect(self.setCollapse) #------------------------------------------------------------------------- ## フレームを開閉するアクション def setCollapse(self): # 現在のステータスを反転する self.collapse = not self.collapse # フレームのビジビリティを変更する self.frame.setHidden(self.collapse) # 開閉状況に合わせてアロータイプを変更する if self.collapse: # 閉じている時は右に向ける self.titleBar.setArrowType(QtCore.Qt.RightArrow) else: # 開いている時は下へ向ける self.titleBar.setArrowType(QtCore.Qt.DownArrow) #---------------------------------------------------------------------------- ## GUIを作るクラス class GUI(QtGui.QMainWindow): def __init__(self, parent=None): super(GUI, self).__init__(parent) loader = QUiLoader() uiFilePath = os.path.join(CURRENT_PATH, 'frameLayout.ui') self.UI = loader.load(uiFilePath) self.setCentralWidget(self.UI) # フレームレイアウトにするクラスに渡す self.frameLayout = FrameLayout(self.UI.toolButton, self.UI.frame) #------------------------------------------------------------------------------ ## GUIの起動 def main(): app = QtGui.QApplication(sys.argv) app.setStyle('plastique') # ← ここでスタイルを指定 ui = GUI() ui.show() sys.exit(app.exec_()) if __name__ == '__main__': main() #----------------------------------------------------------------------------- # EOF #-----------------------------------------------------------------------------