在pyQt5的QGridLayout中的QScrollArea中控制多行QLabel的高度?

时间:2019-11-01 12:18:02

标签: pyqt5

我想要一个小部件,它将是一个水平可滚动的文本标签,放置在窗口的中间(否则将通过QGridLayout进行布局)。在下面的代码示例中,我得到了:

pyqt5-Tester.png

图像显示标签本身分配了垂直空间,该空间足以容纳两行-这正是我想要的。

但是,从标签的末端(底部)到滚动条的开始(顶部),还有额外的垂直空间。

我能以某种方式摆脱这个多余的空间,以便标签保持其当前高度,同时“粘”在滚动条上,同时又保持QGridLayout吗?

代码:

#!/usr/bin/python3

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *

class Example(QWidget):
  def __init__(self):
    super(Example, self).__init__()
    self.initUI()

  def initUI(self):

    self.layout = QGridLayout()

    self.layout.setRowStretch(0, 20)
    self.layout.setRowStretch(1, 0)
    self.layout.setRowStretch(2, 20)

    self.scrollArea = QScrollArea(self)
    self.scrollArea.setWidgetResizable(True)
    self.scrollArea.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)

    self.mylbl = QLabel("[]\n[]", self)
    self.mylbl.setAlignment(Qt.AlignLeft | Qt.AlignTop)
    self.mylbl.setStyleSheet("QLabel {background-color: gray;}")
    self.mylbl.setTextInteractionFlags(Qt.TextSelectableByMouse)
    self.mylbl.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)

    self.scrollArea.setWidget(self.mylbl)
    self.scrollArea.setHorizontalScrollBarPolicy( Qt.ScrollBarAlwaysOn )

    self.layout.addWidget(self.scrollArea, *(1,0), *(1,2))

    self.setLayout(self.layout)

    self.setGeometry(300, 300, 220, 170)
    self.setWindowTitle('Tester')
    self.show()

if __name__ == '__main__':
  app = QApplication(sys.argv)
  ex = Example()
  sys.exit(app.exec_())

1 个答案:

答案 0 :(得分:3)

如果您确定标签将始终具有相同的高度,则可以为滚动区域设置固定的高度:

    # get the size hint of the label
    height = self.mylbl.sizeHint().height()
    # add the scrollbar height
    height += self.scrollArea.horizontalScrollBar().sizeHint().height()
    # add the scrollarea frame size * 2 (top and bottom)
    height += self.scrollArea.frameWidth() * 2

    self.scrollArea.setFixedHeight(height)