Skip to content

Instantly share code, notes, and snippets.

@ShikouYamaue
Created December 18, 2018 14:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ShikouYamaue/dd4be991981a90d3da9a59b4c7a07425 to your computer and use it in GitHub Desktop.
Save ShikouYamaue/dd4be991981a90d3da9a59b4c7a07425 to your computer and use it in GitHub Desktop.
UniqueWigetLayout2
import imp
try:
imp.find_module('PySide2')
from PySide2.QtWidgets import *
from PySide2.QtGui import *
from PySide2.QtCore import *
except ImportError:
from PySide.QtGui import *
from PySide.QtCore import *
from maya.app.general.mayaMixin import MayaQWidgetBaseMixin
from collections import defaultdict
class MainWindow(MayaQWidgetBaseMixin, QMainWindow):
#コンストラクタ
def __init__(self, parent = None, init_pos=False):
super(self.__class__, self).__init__(parent)
self.init_flag = False
sq_widget = QScrollArea(self)
sq_widget.setWidgetResizable(True)#リサイズに中身が追従するかどうか
sq_widget.setFocusPolicy(Qt.NoFocus)#スクロールエリアをフォーカスできるかどうか
sq_widget.setMinimumHeight(1)#ウィンドウの最小サイズ
self.setCentralWidget(sq_widget)
self.unique_layout = QGridLayout()
self.unique_layout.setSpacing(0)#ウェジェットどうしの間隔を設定する
sq_widget.setLayout(self.unique_layout)
self.but_list = []
#ボタングループをはめるサンプル
for i in range(3):
#ラッパーウィジェットを設定してレイアウトはめる
wrapper_widget = QWidget()
wrapper_layout = QHBoxLayout()
wrapper_layout.setSpacing(2)
wrapper_widget.setLayout(wrapper_layout)
#ウィジェットサイズ固定
wrapper_widget.setMinimumWidth(300)
wrapper_widget.setMaximumWidth(300)
name_list = [u'あれや'+str(i), u'これや'+str(i), u'なんや'+str(i), u'かんや'+str(i)]
for name in name_list:
button = QPushButton(name)
wrapper_layout.addWidget(button)
self.but_list.append(wrapper_widget)
#スライダバーとスピンボックスをはめるサンプル
for i in range(3):
wrapper_widget = QWidget()
wrapper_layout = QHBoxLayout()
wrapper_layout.setSpacing(2)
wrapper_widget.setLayout(wrapper_layout)
wrapper_widget.setMinimumWidth(200)
wrapper_widget.setMaximumWidth(200)
spinbox = QSpinBox()
slider = QSlider(Qt.Horizontal)
wrapper_layout.addWidget(spinbox)
wrapper_layout.addWidget(slider)
self.but_list.append(wrapper_widget)
#配置実行
self.init_but_width_list(but_list=self.but_list)
self.set_column_stretch()
#カラムストレッチを設定してボタン配置が間延びしないようにする
def set_column_stretch(self):
self.def_but_width_list = self.init_but_width_list(self.but_list)
for i in range(self.def_but_width_list[-1]):
self.unique_layout.setColumnStretch(i, 0)
self.unique_layout.setColumnStretch(i+1, 1)
#比較用ボタンサイズを予め取得する
def init_but_width_list(self, but_list):
but_width_list = [0]
sum_width = 0
for but in but_list:
sum_width += but.width()
but_width_list.append(sum_width)
return but_width_list
#ウィンドウのリサイズイベントを拾う
def resizeEvent(self, event):
if self.init_flag:
return
win_x = event.size().width()
self.re_arrangement_but(win_x=win_x, grid_v=0, but_list=self.but_list, loop=0)
#ウィジェット配置関数、ウィンドウサイズに応じて再帰的に配置実行
pre_row_count = 0
def re_arrangement_but(self, win_x, grid_v, but_list, loop):
if loop >100:
print 'too deep loop'
return
if not but_list:
return
but_width_list = self.init_but_width_list(but_list)
#ボタン幅比較リストの大きい方からウィンドウサイズと比較していく
for i, but_width in enumerate(but_width_list[::-1][:-1]):
if win_x > but_width+40:#ウィンドウの幅がボタン幅より広かったら配置して次の再帰へ
if i != 0:
set_but_list = but_list[:-i]
else:
set_but_list = but_list[:]
for j, but in enumerate(set_but_list):
self.unique_layout.addWidget(but, grid_v, but_width_list[j], 1, but.width())
break
but_num = len(but_list)-i
new_but_list = but_list[but_num:]
self.re_arrangement_but(win_x=win_x, grid_v=grid_v+1, but_list=new_but_list, loop=loop+1)
if __name__ == '__main__':
window = MainWindow()
window.show()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment