PyQtGraph отключает колесико мыши, но оставляет другие функции мыши нетронутыми

У меня есть виджет pyqtgraph.ViewBox с изображением в нем. Мышь включена, поэтому я могу выбрать прямоугольник на изображении, и оно будет увеличено. Но есть неприятная особенность, масштабирование происходит и при прокрутке колесика мыши.

Как отключить только колесико мыши, а все остальное оставить как есть?

from PyQt5.QtWidgets import QApplication, QMainWindow
import pyqtgraph as pg
import cv2


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        pg.setConfigOption('imageAxisOrder', 'row-major')
        pg.setConfigOption('leftButtonPan', False)  # if False, then dragging the left mouse button draws a rectangle
    
        self.grid = pg.GraphicsLayoutWidget()
        self.top_left = self.grid.addViewBox(row=1, col=1)

        image = cv2.imread('/path/to/your/image.jpg', cv2.IMREAD_UNCHANGED)
        self.image_item = pg.ImageItem()
        self.image_item.setImage(image)
        self.top_left.addItem(self.image_item)

        self.setCentralWidget(self.grid)


def main():
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec_()


if __name__ == '__main__':
    main()

person kalzso    schedule 14.08.2020    source источник


Ответы (2)


Вы можете установить фильтр событий на ViewBox и поймать событие колесика мыши, в данном случае QEvent.GraphicsSceneWheel.

from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtCore import QEvent
import pyqtgraph as pg
import cv2


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        pg.setConfigOption('imageAxisOrder', 'row-major')
        pg.setConfigOption('leftButtonPan', False)  # if False, then dragging the left mouse button draws a rectangle
    
        self.grid = pg.GraphicsLayoutWidget()
        self.top_left = self.grid.addViewBox(row=1, col=1)
        self.top_left.installEventFilter(self)

        image = cv2.imread('/path/to/your/image.jpg', cv2.IMREAD_UNCHANGED)
        self.image_item = pg.ImageItem()
        self.image_item.setImage(image)
        self.top_left.addItem(self.image_item)

        self.setCentralWidget(self.grid)

    def eventFilter(self, watched, event):
        if event.type() == QEvent.GraphicsSceneWheel:
            return True
        return super().eventFilter(watched, event)
person alec    schedule 14.08.2020

Это намного проще, чем принятый ответ. Используйте setMouseEnabled в ViewBox:

from PyQt5.QtWidgets import QApplication, QMainWindow
import pyqtgraph as pg
import cv2


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        pg.setConfigOption('imageAxisOrder', 'row-major')
        pg.setConfigOption('leftButtonPan', False)  # if False, then dragging the left mouse button draws a rectangle

        self.grid = pg.GraphicsLayoutWidget()
        self.top_left = self.grid.addViewBox(row=1, col=1)
        self.top_left.setMouseEnabled(x=False, y=False)  # <--- Add this line

        image = cv2.imread('/path/to/your/image.jpg', cv2.IMREAD_UNCHANGED)
        self.image_item = pg.ImageItem()
        self.image_item.setImage(image)
        self.top_left.addItem(self.image_item)

        self.setCentralWidget(self.grid)


def main():
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec_()


if __name__ == '__main__':
    main()
person Edward Kigwana    schedule 11.02.2021
comment
Я попробовал ваше предложение, но оно не сработало, поэтому принятый ответ по-прежнему является для меня лучшим решением. - person kalzso; 15.02.2021
comment
Я использую pyqtgraph-0.11.0. Когда вы говорите, что это не сработало, что это значит? Я не уверен, что неправильно понял вопрос. - person Edward Kigwana; 17.02.2021
comment
Не работает означает, что масштабирование колеса мыши не игнорируется. Вопрос был об игнорировании колеса, и только колеса, и принятое решение помогает. - person kalzso; 17.02.2021