我想要一个小部件,它将是一个水平可滚动的文本标签,放置在窗口的中间(否则将通过QGridLayout进行布局)。在下面的代码示例中,我得到了:
图像显示标签本身分配了垂直空间,该空间足以容纳两行-这正是我想要的。
但是,从标签的末端(底部)到滚动条的开始(顶部),还有额外的垂直空间。
我能以某种方式摆脱这个多余的空间,以便标签保持其当前高度,同时“粘”在滚动条上,同时又保持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_())
答案 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)