почему mouseMoveEvent () не отслеживает изменение event.button () - PullRequest
1 голос
/ 23 апреля 2019

Я пытаюсь сделать увеличение / уменьшение масштаба, но не только с помощью wheelEvent. Я хочу использовать mouseMoveEvent и сделать масштабирование, как в 3D-программах (Maya), когда нажата кнопка (Alt + Right Mouse) и мышь перемещается вниз / вверх или влево / вправо, она будет увеличивать / уменьшать масштаб. Поэтому я решил взять координаты event.pos (), но масштабирование не требуется, если не нажата правая кнопка мыши. Поэтому я попытался сделать:

def mouseMoveEvent(self, event):
    modifierPressed = QApplication.keyboardModifiers( )
    if (modifierPressed & Qt.AltModifier) == Qt.AltModifier and event.button( ) == Qt.RightButton:
        print('Alt+RightClick')
        print(event.pos( ))

Но я заметил, что event.button() всегда возвращает NoButton. Почему это происходит? Ниже будет приведен полный код, если кто-то хочет попробовать запустить его, но код требует изображений.

from PySide2.QtGui import QPixmap, QBrush, QColor
from PySide2.QtCore import QSize, Qt, Signal, QPointF, QRect, QPoint
from PySide2.QtWidgets import QDialog, QVBoxLayout, QGraphicsView, QGraphicsScene, QFrame, QSizePolicy, QGraphicsPixmapItem, QApplication, QRubberBand

_ui = {}
_ui['images_default'] = [
    ('a', r'imgA.png', QPointF(0, -200)),
    ('b', r'imgB.png', QPointF(0, -300)),
    ('c', r'imgC.png', QPointF(0, -400))
]
_ui['images_pressed'] = [
    ('a', r"imgD.png", QPointF(0, -200)),
    ('b', r"imgE.png", QPointF(0, -300)),
    ('c', r'imgF.png', QPointF(0, -400))
]


class MainWindow(QDialog):
    def __init__(self, parent=None):
        QDialog.__init__(self)
        self.window = 'riga_gui'
        self.title = 'Character GUI'
        self.size = (1000, 650)

        self.create()

    def create(self):
        self.setWindowTitle(self.title)
        self.resize(QSize(*self.size))
        self.graphicsWidget = MainGraphicsWidget(self)

        self.mainLayout = QVBoxLayout()
        self.mainLayout.addWidget(self.graphicsWidget)
        self.setLayout(self.mainLayout)


class MainGraphicsWidget(QGraphicsView):
    def __init__(self, parent=None):
        super(MainGraphicsWidget, self).__init__(parent)
        self._scene = QGraphicsScene(backgroundBrush=Qt.gray)
        self.setScene(self._scene)

        for name, path, position in _ui['images_default']:
            _ui[name + '_buttonItem'] = QGraphicsPixmapItem(QPixmap(path))
            self._scene.addItem(_ui[name + '_buttonItem'])
            _ui[name + '_buttonItem'].setPos(position)

        self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse)
        self.setResizeAnchor(QGraphicsView.AnchorUnderMouse)
        self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.setBackgroundBrush(QBrush(QColor(30, 30, 30)))
        self.setFrameShape(QFrame.NoFrame)
        self.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding))


    def mouseMoveEvent(self, event):
        modifierPressed = QApplication.keyboardModifiers( )
        if (modifierPressed & Qt.AltModifier) == Qt.AltModifier and event.button( ) == Qt.RightButton:
            print('Alt+RightClick')
            print(event.button( ))
        elif (modifierPressed & Qt.AltModifier) == Qt.AltModifier:
            print('Alt')
        super(MainGraphicsWidget, self).mouseMoveEvent(event)


if __name__ == '__main__':
    import sys

    app = QApplication(sys.argv)
    window = MainWindow( )
    window.setGeometry(500, 300, 800, 600)
    window.show( )
    sys.exit(app.exec_( ))

1 Ответ

2 голосов
/ 23 апреля 2019

Согласно документации Qt : Обратите внимание, что для событий перемещения мыши всегда возвращается Qt :: NoButton.

Вместо этого используйте QMouseEvent::buttons():

def mouseMoveEvent(self, event):
    modifierPressed = QApplication.keyboardModifiers( )
    if (modifierPressed & Qt.AltModifier) == Qt.AltModifier and event.buttons( ) == Qt.RightButton:
        print('Alt+RightClick')
        print(event.button( ))
    elif (modifierPressed & Qt.AltModifier) == Qt.AltModifier:
        print('Alt')
    else:
        print("Just move")
        print(event.buttons() == Qt.RightButton)
    super(MainGraphicsWidget, self).mouseMoveEvent(event)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...