Я хотел бы иметь QWidget, который имеет возможность панорамирования и масштабирования внутри него.Pan & Zoom все дети QWidget
Сценарий:
- Когда пользователь использует его среднюю кнопку мыши для прокрутки вверх/вниз, все дети масштабируются от центра виджета.
- Если пользователь удерживает нажатой клавишу «Alt» и нажимает среднюю кнопку мыши, все дети переводятся с использованием расстояния, сделанного мышью.
Идея заключается в создании нового QWidget путем подклассификации другого. Так что я сделал это с QGraphicsView для примера:
UPDATE:
class MyQGraphicsView(QGraphicsView):
def __init__(self):
QGraphicsView.__init__(self)
self.setFocusPolicy(Qt.WheelFocus)
self.setRenderHints(QPainter.Antialiasing)
self.altPressed = False
self.middlePressed = False
self.rightPressed = False
def wheelEvent(self, event):
self.newScale(event.delta(), 1.15)
def keyPressEvent(self, event):
if event.key() == Qt.Key_Alt:
self.altPressed = True
QApplication.setOverrideCursor(Qt.OpenHandCursor)
def keyReleaseEvent(self, event):
if event.key() == Qt.Key_Alt:
self.altPressed = False
QApplication.setOverrideCursor(Qt.ArrowCursor)
def mousePressEvent(self, event):
self._dragPos = event.pos()
if event.button() == Qt.MidButton:
self.middlePressed = True
if event.button() == Qt.RightButton:
self.rightPressed = True
def mouseReleaseEvent(self, event):
if event.button() == Qt.MidButton:
self.middlePressed = False
if event.button() == Qt.RightButton:
self.rightPressed = False
def mouseMoveEvent(self, event):
if self.altPressed:
newPos = event.pos()
if self.middlePressed:
diff = newPos - self._dragPos
self._dragPos = newPos
QApplication.setOverrideCursor(Qt.ClosedHandCursor)
self.horizontalScrollBar().setValue(self.horizontalScrollBar().value() - diff.x())
self.verticalScrollBar().setValue(self.verticalScrollBar().value() - diff.y())
event.accept()
if self.rightPressed:
diff = newPos - self._dragPos
self._dragPos = newPos
QApplication.setOverrideCursor(Qt.SizeAllCursor)
self.newScale(diff.x(), 1.01)
def newScale(self, operator, factor):
if operator > 0:
self.scale(factor, factor)
if operator < 0:
self.scale(1.0/factor, 1.0/factor)
Этот класс отлично подходит для панорамирования и масштабирования, но работает, когда я использую его так:
view = MyQGraphicsView()
scene = QGraphicsScene()
view.setScene(scene)
view.setSceneRect(0, 0, 1000, 1000)
button = QPushButton('Hello !')
button.clicked.connect(self.sayHello)
scene.addWidget(button)
I не можете нажимать на кнопку. Как я могу это решить?
смотри также http://stackoverflow.com/questions/19113532/qgraphicsview-zooming-in-and-out -Под-мышь-позиционный с помощью мыши колеса – Trilarion