У меня есть виджет, размещенный в родительском виджете. Позже дочерний виджет будет содержать изображение. Я хочу иметь возможность перемещать дочерний виджет с помощью мыши, что прекрасно работает, и я хочу иметь возможность изменять размер виджета с помощью колесика мыши. Чтобы установить размер внутреннего виджета, я использую 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)