Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在pyqt5中使用鼠标滚轮在QGraphicscene上缩放图像_Python_Python 3.x_Pyqt5 - Fatal编程技术网

Python 在pyqt5中使用鼠标滚轮在QGraphicscene上缩放图像

Python 在pyqt5中使用鼠标滚轮在QGraphicscene上缩放图像,python,python-3.x,pyqt5,Python,Python 3.x,Pyqt5,我有一个代码可以打开视频,从中提取第一帧,另存为图像,打开图像并在QGraphicscene上显示。我有一个问题-我如何用鼠标滚轮放大和缩小图像 代码OFT_主窗口 from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow")

我有一个代码可以打开视频,从中提取第一帧,另存为图像,打开图像并在QGraphicscene上显示。我有一个问题-我如何用鼠标滚轮放大和缩小图像

代码OFT_主窗口

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(862, 710)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.graphicsView = QtWidgets.QGraphicsView(self.centralwidget)
        self.graphicsView.setGeometry(QtCore.QRect(10, 90, 841, 571))
        self.graphicsView.setMouseTracking(True)
        self.graphicsView.setObjectName("graphicsView")
        self.buttonBox = QtWidgets.QDialogButtonBox(self.centralwidget)
        self.buttonBox.setGeometry(QtCore.QRect(360, 670, 81, 31))
        font = QtGui.QFont()
        font.setPointSize(10)
        self.buttonBox.setFont(font)
        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
        self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Ok)
        self.buttonBox.setObjectName("buttonBox")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(760, 10, 91, 31))
        font = QtGui.QFont()
        font.setPointSize(10)
        self.pushButton.setFont(font)
        self.pushButton.setObjectName("pushButton")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(10, 10, 731, 31))
        self.lineEdit.setObjectName("lineEdit")
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_2.setGeometry(QtCore.QRect(10, 670, 331, 31))
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(10, 50, 841, 31))
        font = QtGui.QFont()
        font.setPointSize(10)
        self.pushButton_2.setFont(font)
        self.pushButton_2.setObjectName("pushButton_2")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "Browse"))
        self.pushButton_2.setText(_translate("MainWindow", "Highlight the field area"))
主代码

import OFT_MainWindow 
import sys
import os
import numpy as np
import cv2
from PIL import Image, ImageQt, ImageEnhance
from PyQt5 import QtWidgets
from PyQt5 import QtGui
from PyQt5 import QtCore
from PyQt5.QtCore import Qt, QPoint
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.Qt import Qt

def main():
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec_() 
    
class MainWindow(QtWidgets.QMainWindow, OFT_MainWindow.Ui_MainWindow):
    
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)  
        self.pushButton.clicked.connect(self.browse_file) 
        self.pushButton_2.clicked.connect(self.imageFrame)
        self.buttonBox.clicked.connect(self.click_OK)
        self.ellipseItem = None
        
###################################################################################    

    def browse_file(self):
        self.lineEdit.clear() 
        file = QtWidgets.QFileDialog.getOpenFileName(self, "Choose video OFT")
        file = str(file[0])
        if file: 
            self.lineEdit.setText(file) 

###################################################################################    

    def imageFrame(self): 
        file = self.lineEdit.text() 
        vidcap = cv2.VideoCapture(file)
        success, image = vidcap.read()
        cv2.imwrite("frame.jpg", image)
        pic = str("frame.jpg")
        scene = QtWidgets.QGraphicsScene(self) 
        self.image = QPixmap(pic) 
        item = QtWidgets.QGraphicsPixmapItem(self.image)
        scene.addItem(item) 
        view = self.graphicsView.setScene(scene) 
        scene.installEventFilter(self)
        
    def eventFilter(self, source, event):
        if event.type() == QtCore.QEvent.GraphicsSceneMousePress:
            for item in self.graphicsView.scene().items(event.scenePos()):
                if isinstance(item, QtWidgets.QGraphicsPixmapItem):
                    self.reference = item
                    self.ellipseItem = QtWidgets.QGraphicsEllipseItem(item)
                    self.ellipseItem.setBrush(QtGui.QColor(0, 255, 0, 75))
                    self.start = item.mapFromScene(event.scenePos())
        elif event.type() == QtCore.QEvent.GraphicsSceneMouseMove and self.ellipseItem:
            end = self.reference.mapFromScene(event.scenePos())
            self.ellipseItem.setFlag(QGraphicsItem.ItemIsMovable, True)
            self.ellipseItem.setFlag(QGraphicsItem.ItemIsSelectable, True)
            self.ellipseItem.setRect(QtCore.QRectF(self.start, end))
        elif event.type() == QtCore.QEvent.GraphicsSceneMouseRelease and self.ellipseItem:
            self.ellipseItem = None
        return super().eventFilter(source, event)

if __name__ == '__main__': 
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.aboutToQuit.connect(app.deleteLater)
    sys.exit(app.exec_())

我试图用wheelEvent实现它,但我做不到。

您必须在图形视图中安装一个事件过滤器,并检查Wheel的
事件

from PyQt5 import QtCore, QtWidgets

class MainWindow(QtWidgets.QMainWindow, OFT_MainWindow.Ui_MainWindow):
    
    def __init__(self, parent=None):
        # ...
        self.graphicsView.viewport().installEventFilter(self)

    def eventFilter(self, source, event):
        if (source == self.graphicsView.viewport() and 
            event.type() == QtCore.QEvent.Wheel):
                if event.angleDelta().y() > 0:
                    scale = 1.25
                else:
                    scale = .8
                self.graphicsView.scale(scale, scale)
                # do not propagate the event to the scroll area scrollbars
                return True
        elif event.type() == QtCore.QEvent.GraphicsSceneMousePress:
            # ...
        return super().eventFilter(source,event)
考虑到滚轮事件也会被截取以进行滚动,所以您可能应该使用一个修改器进行缩放;例如,使用ctrl+wheel:

    def eventFilter(self, source, event):
        if (source == self.graphicsView.viewport() and 
             event.type() == QtCore.QEvent.Wheel and
             event.modifiers() == QtCore.Qt.ControlModifier):
                 # ...