[PySide] ウィンドウの大きさに応じて配置されたボタンを改行する
やりたいことは単純なのですが、地味に苦戦したのでメモ。
クリックで再生
こんな感じに、横幅の大きさに合わせて1行に配置するボタンの数を増減できるようにしたかったのですが
GridLayoutとかだとアウツなので、moveを使って配置するようにしてみました。
以下コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# -*- coding: utf-8 -*- import sys import test_layout from PySide import QtCore, QtGui class TEST(QtGui.QDialog): btn = [] def __init__(self, parent=None): QtGui.QDialog.__init__(self, parent) self.ui = test_layout.Ui_Form() self.ui.setupUi(self) self.add_button() self.resize_move_btn(500) def resizeEvent(self, e): self.resize_move_btn(e.size().width()) def resize_move_btn(self, wid): base_y = 22 base_x = 10 size_x = base_x size_y = base_y for btn in self.btn: if wid < size_x + 100: size_x = base_x size_y += base_y btn.move(size_x, size_y) size_x += btn.sizeHint().width() def add_button(self): for i in range(10): a = QtGui.QPushButton("ButtonA", self.ui.groupBox) self.btn.append(a) app = QtGui.QApplication(sys.argv) win = TEST() win.show() sys.exit(app.exec_()) |
難のひねりもない感じですが、これで出来ました。
苦戦したのが、GroupBoxの横幅を取得する方法。
self.ui.geometry().width() だと、Buttonを押したときにPrintするとかはできたのですが
上のコードの wid < size_x してるところで self.ui.geometry().width() < size_x だと上手く行かず
ヽ(`Д´)ノウワァァァンになりました。
self.ui.groupBox.sizeHint() でも取得できず、仕方ないので引数で横幅を与える
リサイズしたときのイベントで、横幅を取得してボタンを再配置するようにしてみました。
PySideのGeometryの扱いがイマイチよく分からないなぁ