Как использовать setFixedSize () в QWidget без центрирования виджета? - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть виджет, размещенный в родительском виджете. Позже дочерний виджет будет содержать изображение. Я хочу иметь возможность перемещать дочерний виджет с помощью мыши, что прекрасно работает, и я хочу иметь возможность изменять размер виджета с помощью колесика мыши. Чтобы установить размер внутреннего виджета, я использую setFixedSize (), потому что это был единственный способ, который я мог найти, чтобы избежать любого автоматического определения размера и размещения, если размер родительского виджета изменяется. Таким образом, я могу перемещать виджет и изменять его размер с помощью колесика мыши. Но как только его размер изменяется, он переходит в середину родительского виджета. То же самое происходит, если я масштабирую родительский виджет. Но я хочу, чтобы дочерний виджет сохранил свою позицию. Это мой код:

from PySide2 import QtGui, QtCore, QtWidgets

class InnerWidget(QtWidgets.QLabel):
    def __init__(self, parent=None):
        super(InnerWidget, self).__init__(parent=parent)
        self.setText("Inner Widget")
        self.setFixedSize(QtCore.QSize(300,200))
        self.setStyleSheet("background-color: rgb(160, 160, 200)")

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

        self.resize(QtCore.QSize(600, 400))

        layout = QtWidgets.QHBoxLayout(self)
        self.innerWidget = InnerWidget()
        layout.addWidget(self.innerWidget)
        self.mouseOldPos = None
        self.contentSize = self.innerWidget.size()
        self.scaleFactor = 1.0

    def mousePressEvent(self, event):
        self.mouseOldPos = event.pos()

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

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

    def wheelEvent(self, event):
        self.scaleFactor = self.scaleFactor + event.delta()/120 * .1
        self.innerWidget.setFixedSize(self.contentSize * self.scaleFactor) 
...