Created
December 18, 2018 13:56
-
-
Save ShikouYamaue/0ee8ea5578029f1d1891591517d1c2bb to your computer and use it in GitHub Desktop.
UniqueWigetLayout1
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 = [] | |
name_list = [u'あれや', u'これや', u'なんや', u'かんや', u'そしたら', u'どっこい'] | |
for name in name_list: | |
button = QPushButton(name) | |
self.but_list.append(button) | |
#ボタンサイズ固定にしておく(自由だと再配置できない) | |
button.setMaximumWidth(100) | |
button.setMinimumWidth(100) | |
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