Python 如何实现自己的QScrollara

Python 如何实现自己的QScrollara,python,pyqt,pyqt5,qscrollarea,Python,Pyqt,Pyqt5,Qscrollarea,我试图了解a是如何实现我自己的myqscrollara小部件的MyqScrollara应使用。为此,我编写了一个最低限度的工作示例,如下所示: from PyQt5 import QtWidgets import sys class MyScrollArea(QtWidgets.QAbstractScrollArea): def __init__(self): super().__init__() self.label = QtWidgets.QLab

我试图了解a是如何实现我自己的
myqscrollara
小部件的<代码>MyqScrollara应使用。为此,我编写了一个最低限度的工作示例,如下所示:

from PyQt5 import QtWidgets
import sys

class MyScrollArea(QtWidgets.QAbstractScrollArea):
    def __init__(self):
        super().__init__()

        self.label = QtWidgets.QLabel(", ".join(map(str, range(100))), self)

        hScrollBar = self.horizontalScrollBar()

        hScrollBar.setRange(0, self.label.sizeHint().width() - self.sizeHint().width())
        hScrollBar.valueChanged.connect(self._HScrollBarValueChanged)

        self.setViewportMargins(100, 0, 0, 0)
        self._HScrollBarValueChanged(0)

    def _HScrollBarValueChanged(self, value):
        self.label.move(-value + self.viewportMargins().left(), 0)

def main():
    app = QtWidgets.QApplication(sys.argv)
    scroll = MyScrollArea()
    scroll.show()
    app.exec_()

if __name__ == "__main__":
    main()

代码的结果如下所示:

from PyQt5 import QtWidgets
import sys

class MyScrollArea(QtWidgets.QAbstractScrollArea):
    def __init__(self):
        super().__init__()

        self.label = QtWidgets.QLabel(", ".join(map(str, range(100))), self)

        hScrollBar = self.horizontalScrollBar()

        hScrollBar.setRange(0, self.label.sizeHint().width() - self.sizeHint().width())
        hScrollBar.valueChanged.connect(self._HScrollBarValueChanged)

        self.setViewportMargins(100, 0, 0, 0)
        self._HScrollBarValueChanged(0)

    def _HScrollBarValueChanged(self, value):
        self.label.move(-value + self.viewportMargins().left(), 0)

def main():
    app = QtWidgets.QApplication(sys.argv)
    scroll = MyScrollArea()
    scroll.show()
    app.exec_()

if __name__ == "__main__":
    main()

但是,在我滚动内部小部件后,它将移出视口,并在一个我不希望它被绘制的区域中绘制自身:


我做错了什么?如何使功能正常工作?

除了每次修改小部件的几何图形时修改QScrollBar的属性外,还必须将其设置为视口的子对象:

导入系统 从PyQt5导入QtWidgets 类MyScrollArea(qtwidts.QAbstractScrollArea): 定义初始化(自): super()。\uuuu init\uuuuu() self.label=qtwidts.QLabel(“,”.join(map(str,range(100))),self.viewport() self.setViewportMargins(100,0,0,0) self.horizontalScrollBar().valueChanged.connect( self.on\u hscrollbar\u值\u已更改 ) self.update_滚动条() CROLLBAR上的def值已更改(自身,值): self.label.move(-value,0) def更新_滚动条(自身): self.horizontalScrollBar().setRange( 0,self.label.sizeHint().width()-self.viewport().width() ) self.horizontalScrollBar().setPageStep(self.viewport().width()) def resizeEvent(自我,事件): self.update_滚动条() super().resizeEvent(事件) def main(): app=qtwidts.QApplication(sys.argv) scroll=MyScrollArea() scroll.show() app.exec() 如果名称=“\uuuuu main\uuuuuuuu”: main()
除了在每次修改小部件的几何图形时修改QScrollBar的属性外,还必须将其设置为QLabel作为视口的子对象:

导入系统 从PyQt5导入QtWidgets 类MyScrollArea(qtwidts.QAbstractScrollArea): 定义初始化(自): super()。\uuuu init\uuuuu() self.label=qtwidts.QLabel(“,”.join(map(str,range(100))),self.viewport() self.setViewportMargins(100,0,0,0) self.horizontalScrollBar().valueChanged.connect( self.on\u hscrollbar\u值\u已更改 ) self.update_滚动条() CROLLBAR上的def值已更改(自身,值): self.label.move(-value,0) def更新_滚动条(自身): self.horizontalScrollBar().setRange( 0,self.label.sizeHint().width()-self.viewport().width() ) self.horizontalScrollBar().setPageStep(self.viewport().width()) def resizeEvent(自我,事件): self.update_滚动条() super().resizeEvent(事件) def main(): app=qtwidts.QApplication(sys.argv) scroll=MyScrollArea() scroll.show() app.exec() 如果名称=“\uuuuu main\uuuuuuuu”: main()
您不知道我尝试了多少次,但我没有尝试将视口设置为父视口。谢谢你指出这一点。缺少代码的其余部分是由于最小的工作示例造成的。谢谢你的帮助!您不知道我尝试了多少次,但我没有尝试将视口设置为父视口。谢谢你指出这一点。缺少代码的其余部分是由于最小的工作示例造成的。谢谢你的帮助!