Created
February 24, 2019 11:44
-
-
Save ShikouYamaue/4c57b558a0925f55c1a16c3f30f2604c to your computer and use it in GitHub Desktop.
UniqueWigetLayout3
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'どっこい']*50 | |
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() | |
self.init_layout_data() | |
#カラムストレッチを設定してボタン配置が間延びしないようにする | |
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.pre_but_size_list_list = self.but_size_list_list[:] | |
self.init_layout_data() | |
self.re_arrangement_but(win_x=win_x, grid_v=0, but_list=self.but_list, loop=0) | |
if self.pre_but_size_list_list == self.but_size_list_list: | |
return | |
self.layout_widgets() | |
#配置用リストを初期化 | |
def init_layout_data(self): | |
self.but_layout_list_list = [] | |
self.but_size_list_list = [] | |
self.but_length_list_list = [] | |
#ウィジェット配置関数、ウィンドウサイズに応じて再帰的に配置リストを作る | |
pre_row_count = 0 | |
def re_arrangement_but(self, win_x, grid_v, but_list, loop): | |
if loop >1000: | |
print 'too deep loop' | |
return | |
if not but_list: | |
return | |
but_width_list = self.init_but_width_list(but_list) | |
#ボタン幅比較リストの大きい方からウィンドウサイズと比較していく | |
but_layout_list = [] | |
but_size_list = [] | |
but_length_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): | |
but_layout_list.append(but) | |
but_size_list.append(but.width()) | |
but_length_list.append(but_width_list[j]) | |
break | |
if but_size_list: | |
self.but_layout_list_list.append(but_layout_list) | |
self.but_size_list_list.append(but_size_list) | |
self.but_length_list_list.append(but_length_list) | |
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) | |
#リストをもとに配置実行 | |
def layout_widgets(self): | |
for grid_v, (but_layout_list, but_size_list, but_length_list) in enumerate(zip(self.but_layout_list_list, self.but_size_list_list, self.but_length_list_list)): | |
for but , size, length in zip(but_layout_list, but_size_list, but_length_list): | |
self.unique_layout.addWidget(but, grid_v, length, 1, size) | |
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