1

我正在每个选项卡上使用 QGraphicsView 编写一个 MDI 应用程序。我添加项目,移动它们并且有一个组。但是也有很多问题,比如:

  • 对象的一次性分配。我不能用橡皮筋选择一些对象并按住 Shift 键以添加到其他橡皮筋选择的选择中。例如,如果在新分配之前记住旧对象并在之前的分离之后添加它,则可以这样做。但它是通过鼠标事件完成的,它们根本不起作用

  • 当您单击对象执行某些操作时是必需的,但它也可以通过鼠标事件完成...

  • 我需要鼠标滚轮来缩放,然后依靠鼠标事件

可能所有这些动作在鼠标事件中没有现成的解决方案zalezaniya,但我发现的所有教训 - 说唯一的鼠标事件会拯救我

如何让 QGraphicsView 捕捉鼠标事件?

import os
import sys
import sip
import maya.OpenMayaUI as mui
from PyQt4.QtCore import *
from PyQt4.QtGui import *

#----------------------------------------------------------------------
def getMayaWindow():
    ptr = mui.MQtUtil.mainWindow()
    return sip.wrapinstance(long(ptr), QObject)

#----------------------------------------------------------------------
#----------------------------------------------------------------------
class MainForm(QMainWindow):
    def __init__(self):
        super(MainForm, self).__init__(getMayaWindow())
        self.setGeometry(50,50,600,600)

        widget = QWidget()
        self.setCentralWidget(widget)
        layout = QGridLayout()
        widget.setLayout(layout)

        mdiArea = QMdiArea()
        layout.addWidget(mdiArea)

        newItem1 = vrayRectWidget(mdiArea, 'aaaa')
        newItem2 = vrayRectWidget(mdiArea, 'bbbb')

        newItem1.setMouseTracking(True)
        newItem2.setMouseTracking(True)

#----------------------------------------------------------------------
#----------------------------------------------------------------------
class vrayRectWidget(QMdiSubWindow):
    def __init__(self, parent, name):
        super(vrayRectWidget, self).__init__(parent)
        self.setAttribute(Qt.WA_DeleteOnClose)
        self.setWindowTitle(name)

        self.view = MyView()
        self.view.setMouseTracking(True)
        self.setWidget(self.view)


#----------------------------------------------------------------------
#----------------------------------------------------------------------
class MyView(QGraphicsView):
    def __init__(self):
        QGraphicsView.__init__(self)

        self.setGeometry(QRect(100, 100, 600, 400))
        self.setDragMode(QGraphicsView.RubberBandDrag)
        self.setRubberBandSelectionMode(Qt.IntersectsItemShape)
        self.setMouseTracking(True)

        self.setRenderHints(QPainter.Antialiasing | QPainter.SmoothPixmapTransform)

        self.scene = QGraphicsScene(self)
        self.scene.setSceneRect(QRectF())
        self.setScene(self.scene)
        self.setInteractive(True)

        for i in range(5):
            item = QGraphicsEllipseItem(i*75, 10, 60, 40)

            item.setFlag(QGraphicsItem.ItemIsMovable, True)
            item.setFlag(QGraphicsItem.ItemIsSelectable, True)
            self.scene.addItem(item)

    def mousePressEvent(self, event):
        print('mousePressEvent')

#----------------------------------------------------------------------
#----------------------------------------------------------------------
# window
def cacheWnd():
    wnd = MainForm()
    wnd.show()

cacheWnd()
4

2 回答 2

2

在 MyView 中需要一个事件过滤器:

def eventFilter(self,obj,event):
    if obj == self and event.type() == QtCore.QEvent.MouseButtonPress:      # see http://doc.qt.io/qt-5/qevent.html
    # alternatively use QtCore.QEvent.GraphicsSceneMousePress
        print('mousePressEvent')
        return True
    return QtWidgets.QGraphicsView.eventFilter(self,obj,event)

并将他安装在 MyView 的构造函数的末尾:

self.installEventFilter(self)
于 2015-07-22T15:12:51.543 回答
1

鼠标事件的问题已解决。

我开始了一个基于 QGraphicsScene 的新类,它处理所有鼠标事件:

class GraphicsScene(QGraphicsScene):
    def __init__(self, parent=None):
        super(GraphicsScene, self).__init__(parent)
        self.parent = parent

    def mouseReleaseEvent(self, event):
        print('mouseReleaseEvent')
        return QGraphicsScene.mouseReleaseEvent(self, event)
于 2015-07-24T07:46:17.107 回答