Created
December 18, 2018 14:14
-
-
Save ShikouYamaue/dd4be991981a90d3da9a59b4c7a07425 to your computer and use it in GitHub Desktop.
UniqueWigetLayout2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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