Как правильно перемещать виджеты в области прокрутки - PullRequest
0 голосов
/ 23 октября 2019

У меня есть простая QScrollArea с QLabel в качестве внутреннего виджета. Теперь я хочу иметь возможность перемещать внутренний виджет, и если внутренний виджет покидает видимую область, полосы прокрутки должны появляться и правильно перемещаться (и наоборот). Мне удалось создать подвижный внутренний виджет, но мне нужна помощь с полосами прокрутки. Это мой код:

from PySide2 import QtGui, QtCore, QtWidgets

class MyWidget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(MyWidget, self).__init__(parent=parent)

        self.setFixedSize(QtCore.QSize(600, 400))
        layout = QtWidgets.QHBoxLayout(self)
        self.scrollArea = QtWidgets.QScrollArea()
        self.innerWidget = QtWidgets.QLabel("Inner Widget")
        self.innerWidget.setFixedSize(QtCore.QSize(300,200))
        self.innerWidget.setStyleSheet("background-color: rgb(160, 160, 200)")
        self.scrollArea.setWidget(self.innerWidget)
        layout.addWidget(self.scrollArea)
        self.mouseOldPos = None

    def mousePressEvent(self, event):
        rect = self.innerWidget.rect()
        localPos = event.pos() - self.innerWidget.pos()
        if (localPos.x() > 0) and (localPos.y() > 0):
            if rect.contains(localPos.x(),localPos.y()):
                self.mouseOldPos = event.pos()

    def mouseMoveEvent(self, event):
        if self.mouseOldPos is not None:
            delta = self.mouseOldPos - event.pos()
            iwp = self.innerWidget.pos()
            self.innerWidget.move(iwp - delta)
            self.mouseOldPos = event.pos()
            self.scrollArea.ensureWidgetVisible(self.innerWidget)

    def mouseReleaseEvent(self, event):
        self.mouseOldPos = None
...