我在父窗口小部件中放置了一个窗口小部件。稍后,子窗口小部件将包含图像。我希望能够使用鼠标来移动子窗口小部件,但效果很好,并且我希望能够使用鼠标滚轮来调整窗口小部件的大小。要设置内部窗口小部件的大小,我使用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)