どうも!たっくんです!
QScrollAreaを使って、ウインドウが縮小されたらオプションをスクロールしたい時ってありますよね!(*´ω`*)
しかし!
QScrollAreaにレイアウトを設定して作ったのに、縮小してみたらアレー!?ってなる場合があります…(´・ω・`)
こんな時に対処方法をご紹介したいと思います!(`・ω・´)ゞ
原因!
QScrollAreaが思ったように動かないのは、QScrollAreaにレイアウトを設定して中身を作った場合がほとんどだと思います。
from PySide import QtCore, QtGui class OptionWidget(QtGui.QWidget): def __init__(self, *args, **kwargs): super(OptionWidget, self).__init__(*args, **kwargs) mainLayout = QtGui.QHBoxLayout(self) scrollArea = QtGui.QScrollArea(self) scrollArea.setWidgetResizable(True) mainLayout.addWidget(scrollArea) scrollLayout = QtGui.QFormLayout(self) scrollArea.setLayout(scrollLayout)#QScrollAreaにレイアウトを設定して構成 scrollLayout.addRow('Option1', QtGui.QLineEdit(self)) scrollLayout.addRow('Option2', QtGui.QLineEdit(self)) scrollLayout.addRow('Option3', QtGui.QLineEdit(self)) scrollLayout.addRow('Option4', QtGui.QLineEdit(self)) scrollLayout.addRow('Option5', QtGui.QLineEdit(self))
QWidgetを挟む
「QScrollArea」にレイアウトを設定しても期待通りに動かないので、「QScrollArea」の中身を「QWidget」で作成してから設定してあげるとうまく動きます!(*´ω`*)b
from PySide import QtCore, QtGui # QScrollAreaの中身 class InnerWidget(QtGui.QWidget): def __init__(self, *args, **kwargs): super(InnerWidget, self).__init__(*args, **kwargs) mainLayout = QtGui.QFormLayout(self) mainLayout.addRow('Option1', QtGui.QLineEdit(self)) mainLayout.addRow('Option2', QtGui.QLineEdit(self)) mainLayout.addRow('Option3', QtGui.QLineEdit(self)) mainLayout.addRow('Option4', QtGui.QLineEdit(self)) mainLayout.addRow('Option5', QtGui.QLineEdit(self)) class OptionWidget(QtGui.QWidget): def __init__(self, *args, **kwargs): super(OptionWidget, self).__init__(*args, **kwargs) mainLayout = QtGui.QHBoxLayout(self) scrollArea = QtGui.QScrollArea(self) scrollArea.setWidgetResizable(True) mainLayout.addWidget(scrollArea) # QScrollAreaに中身のWidgetを設定 innerWidget = InnerWidget(self) scrollArea.setWidget(innerWidget)
実行してみた結果がコチラ!
限界まで小さくしたい場合
「QScrollArea」が期待通りに動作しましたが、ある程度までしか小さくすることができません。。。(´・ω・`)
Mayaみたいに、ちょーーーー小さくできるようにしたい場合は「setMinimumHeight」を設定します!「QScrollArea」の最小の高さを1pxに設定するといい感じになります!∠( ゚д゚)/
コードは以下のようになります(*´ω`*)b
from PySide import QtCore, QtGui class InnerWidget(QtGui.QWidget): def __init__(self, *args, **kwargs): super(InnerWidget, self).__init__(*args, **kwargs) mainLayout = QtGui.QFormLayout(self) mainLayout.addRow('Option1', QtGui.QLineEdit(self)) mainLayout.addRow('Option2', QtGui.QLineEdit(self)) mainLayout.addRow('Option3', QtGui.QLineEdit(self)) mainLayout.addRow('Option4', QtGui.QLineEdit(self)) mainLayout.addRow('Option5', QtGui.QLineEdit(self)) class OptionWidget(QtGui.QWidget): def __init__(self, *args, **kwargs): super(OptionWidget, self).__init__(*args, **kwargs) mainLayout = QtGui.QHBoxLayout(self) scrollArea = QtGui.QScrollArea(self) scrollArea.setWidgetResizable(True) scrollArea.setMinimumHeight(1) mainLayout.addWidget(scrollArea) innerWidget = InnerWidget(self) scrollArea.setWidget(innerWidget)