首页 > 解决方案 > 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_())

标签: pythonpyqt5

解决方案


解释:

为了更好地理解这一现象,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")

在此处输入图像描述


推荐阅读