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