python - PyQt5 调用 qwidget.setMaximumHeight 导致内容消失
问题描述
下面的代码按我的预期运行。它创建了一个非常长的页面,该页面在充满小部件的屏幕上运行。我想要实现的是相同的页面,但带有滚动条的页面更短。似乎很容易。注释行: self.topWidget.setMaximumHeight(500) 在我取消注释时达到了大小,但所有内容都消失了。为什么该行会产生该结果,我该如何解决?更好的替代方法也会很有趣。谢谢!
import sys
from PyQt5.QtWidgets import (QWidget, QLabel, QApplication, QCheckBox, QHBoxLayout,
QVBoxLayout, QGridLayout)
class Example(QWidget):
def __init__(self, labels):
super().__init__()
self.labels = labels
self.topWidget = QWidget()
self.vbox = QVBoxLayout()
self.topWidget.setLayout(self.vbox)
self.topgrid = QGridLayout()
self.topgrid.addWidget(self.topWidget)
self.setLayout(self.topgrid)
self.initUI()
self.show()
def initUI(self):
for i, t in enumerate(self.labels):
widget = QWidget()
widget.setMaximumHeight(40)
hlayout = QHBoxLayout()
lab = QLabel(t)
lab.setMinimumWidth(self.maxWidth(self.labels) * 6 + 30)
hlayout.addWidget(lab)
hlayout.addWidget(QCheckBox("activate"))
widget.setLayout(hlayout)
self.vbox.addWidget(widget)
# self.topWidget.setMaximumHeight(500)
self.setWindowTitle('Dynamic layout')
def maxWidth(self, arr):
mWidth = 0
for a in arr:
mWidth = max(len(a), mWidth)
return mWidth
if __name__ == '__main__':
app = QApplication(sys.argv)
labs = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',]
ex = Example(labs)
sys.exit(app.exec_())
解决方案
解释:
为了更好地理解这一现象,maximumHeight 必须改变,例如使用 2800 可以得到以下结果:
如您所见,每个小部件具有相同的高度,因为小部件相似,并且 QVBoxLayout 将为每个元素设置相同的高度,如果该高度小于必要的高度,则仅显示一部分。如果对间距为 6 像素的 90 个小部件进行最大高度为 500 的计算,则得到(500 - (89 + 1 + 1) * 6) / 90 = -0.5
等于 0,因此没有观察到小部件。
解决方案:
即使显示小部件,滚动条也不会神奇地出现。解决方案是使用实现该功能的 QScrollArea。
class Example(QWidget):
def __init__(self, labels):
super().__init__()
self.labels = labels
self.topWidget = QScrollArea(widgetResizable=True)
self.topgrid = QGridLayout(self)
self.topgrid.addWidget(self.topWidget)
self.initUI()
self.show()
def initUI(self):
content_widget = QWidget()
vbox = QVBoxLayout(content_widget)
self.topWidget.setWidget(content_widget)
for i, t in enumerate(self.labels):
widget = QWidget()
hlayout = QHBoxLayout(widget)
lab = QLabel(t)
hlayout.addWidget(lab)
hlayout.addWidget(QCheckBox("activate"))
vbox.addWidget(widget)
self.setWindowTitle("Dynamic layout")
推荐阅读
- javascript - 删除多行文本区域文本每行“-”之前的所有字符
- python - 如何将多个csv文件合并为1个文件
- javascript - 远程 Web 服务器对 HTML Web 表单没有 JSON 响应
- php - PHP Curl 错误 HTTP/2 流 0 未完全关闭:PROTOCOL_ERROR (err 1)
- amazon-web-services - AWS ALB - URL 中的相同字符串应该转到相同的 EC2 实例
- sql - Office 更新后出现错误消息“对象或类不支持事件集”
- django-rest-framework - 如何将 dajngo 请求参数传递给 celery 任务
- angular - 在 CanDeactivate 中处理 Observable
- javascript - WordPress 服务器响应调试
- pyspark - 想知道代码中分数部分的工作。我是初学者。请给我清楚的解释