【问题标题】:QScrollArea not showing scrollbars PyQt5 PythonQScrollArea 不显示滚动条 PyQt5 Python
【发布时间】:2021-08-06 01:24:29
【问题描述】:

我一直在尝试创建一个程序,将 QFrame 动态添加到 QVboxLayout。随着越来越多的框架被添加到布局中,框架没有足够的空间来占据。我在谷歌上搜索了这个问题,我发现了很多 stackoverflow 的答案,所有这些都使用了 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_())

【问题讨论】:

    标签: python pyqt5 qscrollarea


    【解决方案1】:

    问题是,当您在 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)
    # ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-13
      • 2019-04-26
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多