问题描述
我正在尝试使用pyqt5创建具有垂直布局的滚动区域,并且将一些标签放入其中。我知道即使是垂直布局,如果文本不合适也应该水平滚动。但是无论我尝试什么,都不会让我滚动。
这是我正在使用的代码:
class window(QMainWindow):
def __init__(self):
super(window,self).__init__()
self.setGeometry(300,300,803,520)
self.init_ui()
def init_ui(self):
self.teacher_Box = QScrollArea(self)
self.teacher_Box.setGeometry(360,10,420,181)
self.teacher_Box.setWidgetResizable(True)
self.teacher_Box.setobjectName("teacher_Box")
self.teacher_Box_widget = QWidget()
self.teacher_Box_widget.setGeometry(QtCore.QRect(0,181))
self.teacher_Box_widget.setobjectName("teacher_Box_widget")
self.verticalLayout = QVBoxLayout(self.teacher_Box_widget)
self.verticalLayout.setobjectName("verticalLayout")
self.teacher_Box.setWidget(self.teacher_Box_widget)
self.teacher_label = QtWidgets.QLabel(self.teacher_Box_widget)
self.teacher_label.setText("This is a new text label that i created using pyqt5's qscrollarea and Now the label is going to get outside the boundaries")
self.teacher_label.adjustSize()
self.teacher_label.move(10,10)
if __name__ == "__main__":
app = QApplication(sys.argv)
win = window()
win.show()
sys.exit(app.exec_())
这是它的外观:
这是它的外观:
我希望我的问题很清楚
解决方法
由于许多问题想知道如何使用许多小部件具有的QScrollArea,因此我将获得许可以详细解释各种形式,并将其用作将来读者的规范答案。
QScrollArea仅允许放置容器小部件,因此必须将其他小部件放置为容器小部件的子级。
要将小部件放置为另一个小部件,有两种可能性:
1。使用QLayout:
QLayouts允许您基于QSizePolicy,strecth,sizeHint等来自动化小部件的几何形状。因此,在这种情况下很简单:只需将widgetResizable属性设置为True。
import sys
from PyQt5 import QtWidgets
class Window(QtWidgets.QMainWindow):
def __init__(self,parent=None):
super(Window,self).__init__(parent)
central_widget = QtWidgets.QWidget()
self.setCentralWidget(central_widget)
scroll_area = QtWidgets.QScrollArea(central_widget)
scroll_area.setGeometry(360,10,420,180)
scroll_area.setWidgetResizable(True)
container = QtWidgets.QWidget()
scroll_area.setWidget(container)
# Set widgets via layout
lay = QtWidgets.QVBoxLayout(container)
lay.setContentsMargins(10,0)
for letter in "ABCDE":
text = letter * 100
label = QtWidgets.QLabel(text)
lay.addWidget(label)
lay.addStretch()
self.setGeometry(300,300,803,520)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
win = Window()
win.show()
sys.exit(app.exec_())
2。直接设置无布局的小部件:
在这种情况下,您必须计算包含内部小部件的最小几何图形并在容器中设置尺寸,还必须将widgetResizable属性设置为False:
import sys
from PyQt5 import QtCore,QtWidgets
class Window(QtWidgets.QMainWindow):
def __init__(self,180)
scroll_area.setWidgetResizable(False)
container = QtWidgets.QWidget()
scroll_area.setWidget(container)
# calculate geometry
geometry = QtCore.QRect(10,0)
for letter in "ABCDE":
text = letter * 100
label = QtWidgets.QLabel(text,container)
label.adjustSize()
label.move(geometry.bottomLeft())
geometry |= label.geometry()
geometry.setTopLeft(QtCore.QPoint(0,0))
container.resize(geometry.size())
self.setGeometry(300,520)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
win = Window()
win.show()
sys.exit(app.exec_())