如何解决如何对QAbstractScrollArea使用setSizePolicy
我正在尝试使用setSizePolicy的QWidget属性。与QWidget或QFrame一起使用此功能可以正常工作。但是,将此功能与QAbstractScrollArea结合使用时,结果出乎意料。
下面的最小工作示例演示了此行为:
在两个Parent
小部件中排列的是 QAbstractScrollArea 小部件的布局,在右边是一组 QFrame 小部件。每个小部件都分配有一个单独的高度,并且所有小部件都在大小策略中指定为固定为 sizeHint 返回大小,该大小固定为上述高度。
from PyQt5 import QtCore,QtWidgets
import sys
class ASWidget(QtWidgets.QAbstractScrollArea):
def __init__(self,height,parent=None):
super().__init__(parent)
self.setSizePolicy(QtWidgets.QSizePolicy.Fixed,QtWidgets.QSizePolicy.Fixed)
self._height = height
self.setStyleSheet("background: red;")
def sizeHint(self):
return QtCore.QSize(100,self._height)
class NonASWidget(QtWidgets.QFrame):
def __init__(self,self._height)
class ParentWidget(QtWidgets.QWidget):
def __init__(self,classType,parent=None):
super().__init__(parent)
layout = QtWidgets.QVBoxLayout(self)
layout.setContentsMargins(0,0)
layout.setSpacing(1)
sizes = [5,15,25,35,45,55,65]
for i in sizes:
layout.addWidget(classType(i))
class Dialog(QtWidgets.QDialog):
def __init__(self):
super().__init__()
w1 = ParentWidget(ASWidget,self)
w2 = ParentWidget(NonASWidget,self)
w2.move(110,0)
def main():
app = QtWidgets.QApplication(sys.argv)
dialog = Dialog()
dialog.show()
app.exec_()
if __name__ == "__main__":
main()
上面的代码结果是此屏幕截图:
如您所见,与右侧的QFrame控件相比,左侧的QAbstractScrollArea控件未使用固定大小策略。
这背后的原因是什么?如何将 setSizePolicy 功能与 QAbstractScrollArea 小部件一起使用?
解决方法
在对小部件进行子类化时(除了QWidget本身),重要的是要记住,所有现有的Qt子类都还设置了一些默认属性或重新实现方法,包括抽象方法。
minimumSizeHint()
是推荐的窗口小部件的最小尺寸,布局将(几乎)始终遵循该要求。以下段落很重要:
除非设置了minimumSize()或将大小策略设置为QSizePolicy :: Ignore,否则QLayout绝不会将窗口小部件的大小调整为小于最小大小提示。如果设置了minimumSize(),则最小尺寸提示将被忽略。
最小提示非常重要,因为它仅对布局内的小部件有效,并且还可以用作[sub]类的“默认”,而不是使用minimumSize()
,后者应用于实例代替。
尽管许多小部件返回无效的最小尺寸提示(如 ignored 所示),而其他则没有,因为设置默认的最小尺寸对于它们的性质很重要。对于QAbstractButton的子类和QAbstractScrollArea的所有子类,都会发生这种情况。
要覆盖此行为(虽然建议不要使用某个大小),只需覆盖该方法。请注意,最好让sizeHint()
返回minimumSizeHint()
而不是相反,这样sizeHint()
总是遵循最小提示,但仍然可以在其他子类中覆盖。
class ASWidget(QtWidgets.QAbstractScrollArea):
def __init__(self,height,parent=None):
super().__init__(parent)
self.setSizePolicy(QtWidgets.QSizePolicy.Fixed,QtWidgets.QSizePolicy.Fixed)
self._height = height
self.setStyleSheet("background: red;")
def sizeHint(self):
return self.minimumSizeHint()
def minimumSizeHint(self):
return QtCore.QSize(100,self._height)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。