Эта проблема характерна для PyQt5, но ответы C++ Qt5 тоже подходят.
В QScrollArea с фиксированной шириной и переменной высотой у меня есть QVBoxLayout
, который содержит QLabel
s. Эти QLabels
имеют setWordWrap(True)
и содержат текст, длина которого может превышать фиксированную ширину QScrollArea
. Когда текст внутри QLabel
переносится на ~4 строки, все работает нормально, но когда QLabel
требуется больше, он не может продолжать увеличивать высоту QLabel
и обрезает часть текста сверху и снизу.
В этом ответе была предпринята попытка исправить по существу ту же проблему, которая включает установку sizePolicy()
по вертикали QLabel
на MinimumExpanding
, и это технически< /em> сработало, но это заставит QLabels
попытаться заполнить всю область просмотра QScrollArea
, если область просмотра еще не заполнена QLabel
s.
Вот как это выглядит в настоящее время без sizePolicy
, установленного на MinimumExpanding
(обратите внимание на 1-е QLabel
):
Вот как это выглядит, когда MinimumExpanding
установлено в качестве политики вертикального размера для QLabel
s (выглядит великолепно...):
Но это приводит к такому поведению, когда в области прокрутки всего несколько QLabel
, что является неприемлемым поведением, поскольку это будет служба «комментариев», где люди могут публиковать свои вопросы в виде простого текста:
У кого-нибудь есть обходной путь для этой проблемы или что-то подобное?
Для справки, вот часть моего кода:
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;
}
""")
QLabels
, которые я показал на изображении в качестве примера, должны занимать минимальную высоту, чтобы вмещался только текст внутри. Однако если на метке установлено значениеMinimumExpanding
, это увеличивает высотуQLabel
до высоты области просмотра. Контейнер, содержащий метки, представляет собойScrollArea
. - person bhlee   schedule 15.04.2018QLabels
НЕ занимает ВСЮ область просмотра, что приводит к третьему изображению, что объясняется в комментарии выше. - person bhlee   schedule 15.04.2018MinimumExpanding
наQLabels
и показывает правильное поведение, когда количество виджетов заполняетQScrollArea
, однако, когда QLabels является небольшим числом и только частично заполняет текущую область просмотра, они расширяются, чтобы заполнить данный видовой экран, показанный на изображении 3. Это не то, что я хочу, я хочу, чтобыQLabel
сжались и заняли минимальную высоту, необходимую для размещения текста, подобного изображению 2. Кроме того, я отредактировал код, чтобы он теперь работал. - person bhlee   schedule 15.04.2018