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

#python #pyqt5 #mouseevent #pyqtgraph #viewbox

#питон #pyqt5 #mouseevent #pyqtgraph ( графический объект ) #окно просмотра #python

Вопрос:

У меня есть виджет 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()
  

Ответ №1:

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

 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()
  

Комментарии:

1. Я попробовал ваше предложение, но оно не сработало, так что принятый ответ по-прежнему является лучшим решением для меня.

2. Я использую pyqtgraph-0.11.0. Когда вы говорите, что это не сработало, что это значит? Я не уверен, что неправильно понял вопрос.

3. Не работает, означает, что масштабирование колесиком мыши не игнорируется. Вопрос заключался в игнорировании колеса, и только колеса, и принятое решение делает свое дело.

Ответ №2:

Вы можете установить фильтр событий в окне просмотра и перехватить событие колеса мыши, в данном случае 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)