QScrollArea 不显示滚动条 PyQt5 Python
QScrollArea not showing scrollbars PyQt5 Python
我一直在尝试创建一个将 QFrames 动态添加到 QVboxLayout 的程序。随着越来越多的框架被添加到布局中,框架没有足够的 space 来占用。我搜索了 google 这个问题,我发现了很多 Whosebug 的答案,所有这些答案都使用了一个 QScrollArea。但是当我在其中添加带有 QVBoxLayout 的 QScrollArea 时,滚动条不会显示。任何帮助将不胜感激。这是最小的可重现示例:
from PyQt5 import QtCore, QtGui, QtWidgets
class Frame(QtWidgets.QFrame):
def __init__(self,parent=None):
super(Frame,self).__init__(parent)
self.setStyleSheet("background-color:red")
self.lbl=QtWidgets.QLabel(self)
self.lbl.setText("Sample Test")
self.font=QtGui.QFont()
self.font.setPointSize(20)
self.lbl.setFont(self.font)
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.setFixedSize(984, 641)
MainWindow.setStyleSheet("background-color:rgb(255,255,255);")
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
#Some UI
self.addBtn = QtWidgets.QPushButton(self.centralwidget)
self.addBtn.setGeometry(QtCore.QRect(450, 100, 71, 51))
self.addBtn.setText("+")
font = QtGui.QFont()
font.setPointSize(20)
self.addBtn.setFont(font)
self.addBtn.setStyleSheet("background-color:rgb(89, 183, 255);border-radius:15px;color:white;")
self.addBtn.setFlat(True)
self.addBtn.setObjectName("addTaskBtn")
self.addBtn.clicked.connect(self.addFrame)
self.scroller = QtWidgets.QScrollArea(self.centralwidget)
self.scroller.setGeometry(QtCore.QRect(0, 230, 991, 411))
self.scroller.setWidgetResizable(True)
self.scroller.setObjectName("scroller")
self.scrollAreaWidgetContents = QtWidgets.QWidget()
self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 989, 409))
self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
self.layoutManager=QtWidgets.QVBoxLayout(self.scroller)
self.scrollAreaWidgetContents.setLayout(self.layoutManager)
self.scroller.setWidget(self.scrollAreaWidgetContents)
MainWindow.setCentralWidget(self.centralwidget)
def addFrame(self):
#Code to add the frame
self.layoutManager.addWidget(Frame())
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
问题是,当您在 True 中使用 widgetResizable 模式时,它使用小部件的 sizeHint,但在您的情况下,QFrame 的 sizeHint 没有考虑 QLabel 的 sizeHint。一种可能的解决方案是使用布局。
class Frame(QtWidgets.QFrame):
def __init__(self, parent=None):
super(Frame, self).__init__(parent)
self.setStyleSheet("background-color:red")
self.lbl = QtWidgets.QLabel()
self.lbl.setText("Sample Test")
font = QtGui.QFont()
font.setPointSize(20)
self.lbl.setFont(font)
lay = QtWidgets.QVBoxLayout(self)
lay.addWidget(self.lbl)
另一方面,我发现在我的测试中出现了滚动条,但只是一部分,因为当您使用 setGeometry 建立它时,它在重新计算某些值时出现问题。一种可能的解决方案是使用包含 QScrollArea 的小部件:
# ...
self.addBtn.clicked.connect(self.addFrame)
container = QtWidgets.QWidget(self.centralwidget)
container.setGeometry(QtCore.QRect(0, 230, 991, 411))
lay_container = QtWidgets.QVBoxLayout(container)
self.scroller = QtWidgets.QScrollArea()
lay_container.addWidget(self.scroller)
self.scroller.setWidgetResizable(True)
# ...
我一直在尝试创建一个将 QFrames 动态添加到 QVboxLayout 的程序。随着越来越多的框架被添加到布局中,框架没有足够的 space 来占用。我搜索了 google 这个问题,我发现了很多 Whosebug 的答案,所有这些答案都使用了一个 QScrollArea。但是当我在其中添加带有 QVBoxLayout 的 QScrollArea 时,滚动条不会显示。任何帮助将不胜感激。这是最小的可重现示例:
from PyQt5 import QtCore, QtGui, QtWidgets
class Frame(QtWidgets.QFrame):
def __init__(self,parent=None):
super(Frame,self).__init__(parent)
self.setStyleSheet("background-color:red")
self.lbl=QtWidgets.QLabel(self)
self.lbl.setText("Sample Test")
self.font=QtGui.QFont()
self.font.setPointSize(20)
self.lbl.setFont(self.font)
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.setFixedSize(984, 641)
MainWindow.setStyleSheet("background-color:rgb(255,255,255);")
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
#Some UI
self.addBtn = QtWidgets.QPushButton(self.centralwidget)
self.addBtn.setGeometry(QtCore.QRect(450, 100, 71, 51))
self.addBtn.setText("+")
font = QtGui.QFont()
font.setPointSize(20)
self.addBtn.setFont(font)
self.addBtn.setStyleSheet("background-color:rgb(89, 183, 255);border-radius:15px;color:white;")
self.addBtn.setFlat(True)
self.addBtn.setObjectName("addTaskBtn")
self.addBtn.clicked.connect(self.addFrame)
self.scroller = QtWidgets.QScrollArea(self.centralwidget)
self.scroller.setGeometry(QtCore.QRect(0, 230, 991, 411))
self.scroller.setWidgetResizable(True)
self.scroller.setObjectName("scroller")
self.scrollAreaWidgetContents = QtWidgets.QWidget()
self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 989, 409))
self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
self.layoutManager=QtWidgets.QVBoxLayout(self.scroller)
self.scrollAreaWidgetContents.setLayout(self.layoutManager)
self.scroller.setWidget(self.scrollAreaWidgetContents)
MainWindow.setCentralWidget(self.centralwidget)
def addFrame(self):
#Code to add the frame
self.layoutManager.addWidget(Frame())
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
问题是,当您在 True 中使用 widgetResizable 模式时,它使用小部件的 sizeHint,但在您的情况下,QFrame 的 sizeHint 没有考虑 QLabel 的 sizeHint。一种可能的解决方案是使用布局。
class Frame(QtWidgets.QFrame):
def __init__(self, parent=None):
super(Frame, self).__init__(parent)
self.setStyleSheet("background-color:red")
self.lbl = QtWidgets.QLabel()
self.lbl.setText("Sample Test")
font = QtGui.QFont()
font.setPointSize(20)
self.lbl.setFont(font)
lay = QtWidgets.QVBoxLayout(self)
lay.addWidget(self.lbl)
另一方面,我发现在我的测试中出现了滚动条,但只是一部分,因为当您使用 setGeometry 建立它时,它在重新计算某些值时出现问题。一种可能的解决方案是使用包含 QScrollArea 的小部件:
# ...
self.addBtn.clicked.connect(self.addFrame)
container = QtWidgets.QWidget(self.centralwidget)
container.setGeometry(QtCore.QRect(0, 230, 991, 411))
lay_container = QtWidgets.QVBoxLayout(container)
self.scroller = QtWidgets.QScrollArea()
lay_container.addWidget(self.scroller)
self.scroller.setWidgetResizable(True)
# ...