代码之家  ›  专栏  ›  技术社区  ›  bhlee

如何调整qlabel的大小以适应QScrollArea中的内容

  •  1
  • bhlee  · 技术社区  · 6 年前

    这个问题特定于PyQt5,但C++Qt5的答案也很好。

    在固定宽度和可变高度的QScrollArea内,我有一个 QVBoxLayout 包含 QLabel s、 这些 QLabels setWordWrap(True) 并包含可能长于 QScrollArea 。当 QLabel公司 包装到4行左右,一切正常,但当 QLabel公司 不仅如此,它无法继续增加 QLabel公司 ,并在顶部和底部剪切一些文本。

    This answer 试图解决本质上相同的问题,包括设置 QLabel公司 的垂直 sizePolicy() MinimumExpanding ,还有这个 从技术上讲 成功了,但它会迫使 QLabels公司 尝试填充整个 QScrollArea公司 视口(如果视口未填充) QLabel公司 还没有。

    以下是没有 sizePolicy 设置为 最小扩展 (注意1号 QLabel公司 ):

    sizePolicy not set

    以下是当 最小扩展 设置为的垂直大小策略 QLabel公司 s(看起来很棒…):

    sizePolicy set

    但当只有少数人 QLabel公司 在滚动区域,这是不可接受的行为,因为这将是一个“评论”服务,人们可以在这里以纯文本形式发布他们的问题:

    unacceptable behavior

    是否有人对此问题有解决方法,或有类似的经验?

    以下是我的一些代码供参考:

    class NewsList(QtWidgets.QScrollArea):
        def __init__(self, parent=None):
            super(NewsList, self).__init__(parent)
            self.setMaximumWidth(200)
            self.setWidgetResizable(True)
    
            layout = QtWidgets.QVBoxLayout()
            layout.setContentsMargins(5, 5, 5, 5)
            layout.setSpacing(5)
            layout.setAlignment(QtCore.Qt.AlignTop)
            self.news_widget = QtWidgets.QFrame()
            self.news_widget.setStyleSheet("""
                QFrame {
                    background-color: #ffffff;
                }
            """)
            self.news_widget.setLayout(layout)
            self.setWidget(self.news_widget)
            self.fetch_news()
    
        def fetch_news(self):
            self.append_message('DSADAISH dshadbsasdsadh sd ashd sah dsha dhsa dsa d')
            self.append_message('DSADAISH dshadbsasdsadh sd ashd sah dsha dhsa dsa d')
            self.append_message('DSADAISH dshadbsasdsadh sd ashd sah dsha dhsa dsa d DSADAISH dshadbsasdsadh sd ashd sah dsha dhsa dsa d')
            self.append_message('DSADAISH ')
            self.append_message('DSADAISH ')
            self.append_message('DSADAISH dshadbsasdsadh sd ashd sah dsha dhsa dsa d')
            self.append_message('DSADAISH dshadbsasdsadh sd ashd sah dsha dhsa dsa d')
    
        def append_message(self, text):
            new_item = QtWidgets.QLabel(text)
            new_item.setWordWrap(True)
            new_item.setStyleSheet("""
                QLabel {
                    padding: 4px;
                    border: 1px solid black;
                    background-color: #ffffff;
                }
            """)
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   ekhumoro    6 年前

    通过使用 addStretch 包含新闻项的布局方法:

    class NewsList(QtWidgets.QScrollArea):
        def __init__(self, parent=None):
            ...    
            layout = QtWidgets.QVBoxLayout()
            layout.setContentsMargins(5, 5, 5, 5)
            layout.setSpacing(5)
            layout.setAlignment(QtCore.Qt.AlignTop)
            # add a stretchable space to the bottom of the layout
            layout.addStretch(1)
    
        def append_message(self, text):
            ...
            # set the size policy of the label
            new_item.setSizePolicy(
                QtWidgets.QSizePolicy.Preferred,
                QtWidgets.QSizePolicy.MinimumExpanding)
            # insert the label before the spacer        
            layout = self.news_widget.layout()
            layout.insertWidget(layout.count() - 1, new_item)
    

    垫片将标签向上推,从而阻止标签拉伸以占用可用空间。使用 拉伸系数 的参数 添加拉伸 确保间隔符始终优先于布局中的其他项目。