【问题标题】:Setting the scroll bar to the bottom on PyQt5 (using scrollArea and a gridLayout)在 PyQt5 上将滚动条设置为底部(使用 scrollArea 和 gridLayout)
【发布时间】:2021-11-23 10:30:35
【问题描述】:

我有一个 QScrollArea,里面有一个 QGridLayout。这说 QGridLayout 充满了 100x100 网格上的按钮。我希望垂直滚动条从底部而不是顶部开始。我已经在网上搜索了如何做到这一点,但到目前为止没有任何效果。

import sys
from PyQt5 import QtWidgets


class IndicSelectWindow(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super(IndicSelectWindow, self).__init__(parent=parent)
        self.resize(500, 400)
        self.layout = QtWidgets.QHBoxLayout(self)
        self.scrollArea = QtWidgets.QScrollArea(self)
        self.scrollArea.setWidgetResizable(True)
        self.scrollAreaWidgetContents = QtWidgets.QWidget()
        self.gridLayout = QtWidgets.QGridLayout(self.scrollAreaWidgetContents)
        self.scrollArea.setWidget(self.scrollAreaWidgetContents)
        self.layout.addWidget(self.scrollArea)

        for i in range(100):
            for j in range(100):
                self.gridLayout.addWidget(QtWidgets.QPushButton(), i, j)



if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = IndicSelectWindow()
    w.show()
    sys.exit(app.exec_())

编辑:试图更好地解释 - 我需要滚动到底部,所以当我打开窗口时,滚动条位于底部而不是顶部。

我尝试过的:

x = self.scrollArea.verticalScrollBar().maximum()
self.scrollArea.verticalScrollBar().setValue(x)

x = self.scrollArea.verticalScrollBar().maximum()
self.scrollArea.verticalScrollBar().setSliderPosition(x)

【问题讨论】:

  • 你的问题不清楚,请解释清楚
  • @eyllanesc 我已经编辑了它,试图更好地解释。我需要的是滚动到底部,而不是获取默认滚动条位置(顶部)
  • x 中的self.scrollArea.verticalScrollBar().setValue(x) 是什么?
  • @eyllanesc 它是self.scrollArea.verticalScrollBar().maximum()

标签: python pyqt5 qscrollarea


【解决方案1】:

问题是滚动条几何在以下情况下更新:

  • 小部件设置为 QScrollArea。
  • QScrollArea 可见。
  • QScrollArea 的大小发生变化。
  • 小部件大小会在可见时发生变化。

所以当先放置widget再放置按钮时,QScrollArea并没有得到通知,所以有2种解决方案:

  • 显示后立即移动滚动条。

        for i in range(100):
            for j in range(100):
                self.gridLayout.addWidget(QtWidgets.QPushButton(), i, j)
        QtCore.QTimer.singleShot(0, self.handle_timeout)
    
    def handle_timeout(self):
        x = self.scrollArea.verticalScrollBar().maximum()
        self.scrollArea.verticalScrollBar().setValue(x)
    
  • 在放置按钮后将小部件设置为 QScrollArea。

    class IndicSelectWindow(QtWidgets.QDialog):
        def __init__(self, parent=None):
            super(IndicSelectWindow, self).__init__(parent=parent)
            self.resize(500, 400)
            self.layout = QtWidgets.QHBoxLayout(self)
            self.scrollArea = QtWidgets.QScrollArea(self)
            self.scrollArea.setWidgetResizable(True)
            self.scrollAreaWidgetContents = QtWidgets.QWidget()
            self.gridLayout = QtWidgets.QGridLayout(self.scrollAreaWidgetContents)
    
            self.layout.addWidget(self.scrollArea)
            for i in range(100):
                for j in range(100):
                    self.gridLayout.addWidget(QtWidgets.QPushButton(), i, j)
    
            self.scrollArea.setWidget(self.scrollAreaWidgetContents)
            x = self.scrollArea.verticalScrollBar().maximum()
            self.scrollArea.verticalScrollBar().setValue(x)
    

【讨论】:

    猜你喜欢
    • 2012-02-28
    • 1970-01-01
    • 2014-12-12
    • 2020-01-20
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多