QScrollAreaが思ったように動かない!?




takkun
どうも!たっくんです!

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)