如何调整QLabels的大小以适应QScrollA中的内容

2024-09-29 20:27:38 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题是针对PYQT5的,但是C++ QT5的答案也很好。在

在一个具有固定宽度和可变高度的QScrollArea中,我有一个QVBoxLayout,它包含QLabels。这些{}包含{},并且包含的文本可能比{}的固定宽度长。当QLabel中的文本换行到~4行时,一切都正常,但是当QLabel需要更多的内容时,它无法继续增加QLabel的高度,并在顶部和底部切掉一些文本。在

This answer试图解决本质上相同的问题,这涉及到将QLabel的垂直sizePolicy()设置为MinimumExpanding,这在技术上是有效的,但是如果该视口还没有被QLabel填充,它将迫使{}尝试填充整个{}视口。在

以下是当前没有将sizePolicy设置为MinimumExpanding的情况(注意第一个QLabel):

sizePolicy not set

以下是将MinimumExpanding设置为QLabels的垂直大小策略时的外观(看起来很棒…):

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;
            }
        """)

Tags: 文本selfmessagesdnewslayoutappenddsa
1条回答
网友
1楼 · 发布于 2024-09-29 20:27:38

通过使用包含新闻项的布局的^{}方法,可以很简单地解决这一问题:

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)

将标签向上伸展,使标签向上伸展。使用addStretch拉伸因子参数可确保间隔符始终优先于布局中的其他项。

相关问题 更多 >

    热门问题