1

各タブに QGraphicsView を使用して MDI アプリケーションを作成しています。アイテムを追加して移動すると、グループができます。しかし、次のような多くの問題があります。

  • オブジェクトの 1 回限りの割り当て。一部のオブジェクトをラバー バンドで選択し、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 に eventfilter が必要です。

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 に答える