设置滚动区域最初移动

Posted

技术标签:

【中文标题】设置滚动区域最初移动【英文标题】:Set scroll area initially moved 【发布时间】:2019-08-29 09:07:25 【问题描述】:

我需要在滚动区域内创建一个大小部件,并最初将两个滑块设置在栏的中间。滚动条不起作用,我认为小部件连接不好。 MRE:

from PyQt5 import QtCore, QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget
import sys


class Diedrico(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
    # Draws stuff


class UiVentana(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(UiVentana, self).__init__(parent)
        ventana.resize(1500, 1015)
        ventana.setFixedSize(1500, 1015)
        self.widget_central = QtWidgets.QWidget(ventana)

        scrol = QtWidgets.QScrollArea(self.widget_central)
        scrol.setWidgetResizable(True)
        scrol.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
        scrol.setGeometry(QtCore.QRect(1010, 510, 470, 460))

        self.Diedrico = Diedrico(scrol)
        self.Diedrico.setGeometry(QtCore.QRect(0, 0, 1000, 1000))
        # This widget should be big enough to use the scroll bar, but it does not work

        ventana.setCentralWidget(self.widget_central)
        ventana.show()


if __name__ == "__main__":
    app = QtWidgets.QApplication([])
    ventana = QtWidgets.QMainWindow()
    ui = UiVentana()
    sys.exit(app.exec_())

【问题讨论】:

【参考方案1】:

问题似乎来自scrol.setWidgetResizable(True),它似乎调整了内容的大小...将其设置为 False 对我有用。

此外,要使滚动条居中,还有一些选项,例如设置verticalScrollBar 的值或使用ensureVisible(x, y)。

一个可行的解决方案:

from PyQt5 import QtCore, QtWidgets
import sys

class UiVentana(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(UiVentana, self).__init__(parent)
        self.setupUi()

        self.label.setGeometry(QtCore.QRect(10, 0, 282, 331))
        self.label.setText("this is a long text\n" * 100)

        self.scrollArea.verticalScrollBar().setValue(300)

    def setupUi(self):
        self.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(self)

        self.scrollArea = QtWidgets.QScrollArea(self.centralwidget)
        self.scrollArea.setGeometry(QtCore.QRect(470, 330, 301, 211))
        self.scrollArea.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
        self.scrollArea.setWidgetResizable(False)

        self.scrollAreaWidgetContents = QtWidgets.QWidget()
        self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 282, 10000))

        self.label = QtWidgets.QLabel(self.scrollAreaWidgetContents)

        self.scrollArea.setWidget(self.scrollAreaWidgetContents)

        self.setCentralWidget(self.centralwidget)

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    ui = UiVentana()
    ui.show()
    sys.exit(app.exec_())

【讨论】:

以上是关于设置滚动区域最初移动的主要内容,如果未能解决你的问题,请参考以下文章

BetterScroll 移动端滚动

UICollectionView 最初滚动跳跃

pageX、clientX、screenX、offsetX、ScrollLeft、ScrollTop、clientLeft、screenLeft

【CSS】为啥设置不显示滚动条不好用呢?

CSS3 移动端 滚动置顶 吸顶

如何设置scrollview的滚动区域在本身的上方