2013-07-26 2 views
4

QGraphicsView에서 다양한 마우스 이벤트의 좌표를 가져 오려고하지만이를 트리거하는 방법을 알 수 없습니다. 결국, 나는 graphicsView에 그림을 추가하고 그 위에 그립니다.QGraphicsView에 대한 PyQt 마우스 이벤트

은 이상적으로는 좌표가 왼쪽 상단에 기원을 가지고 싶은

0,0-------------------- 
| 
| 
| 
| 
| 
| 
|   

test.py

import sys 
from PyQt4 import QtCore, QtGui, uic 


class test(QtGui.QMainWindow): 

    def __init__(self): 
     QtGui.QMainWindow.__init__(self) 
     self.ui = uic.loadUi('test.ui', self) 

     self.connect(self.ui.graphicsView, QtCore.SIGNAL("mousePressEvent()"), self.mouse_pressed) 
     self.connect(self.ui.graphicsView, QtCore.SIGNAL("mouseMoveEvent()"), self.mouse_moved) 
     self.connect(self.ui.graphicsView, QtCore.SIGNAL("mouseReleaseEvent()"), self.mouse_released) 

     self.ui.show() 

    def mouse_pressed(self): 
     p = QtGui.QCursor.pos() 
     print "pressed here: " + p.x() + ", " + p.y() 

    def mouse_moved(self): 
     p = QtGui.QCursor.pos() 
     print "moved here: " + p.x() + ", " + p.y() 

    def mouse_released(self): 
     p = QtGui.QCursor.pos() 
     print "released here: " + p.x() + ", " + p.y() 


def main(): 
    app = QtGui.QApplication(sys.argv) 
    ui = test() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 

test.ui

<?xml version="1.0" encoding="UTF-8"?> 
<ui version="4.0"> 
<class>MainWindow</class> 
<widget class="QMainWindow" name="MainWindow"> 
    <property name="geometry"> 
    <rect> 
    <x>0</x> 
    <y>0</y> 
    <width>800</width> 
    <height>600</height> 
    </rect> 
    </property> 
    <property name="windowTitle"> 
    <string>MainWindow</string> 
    </property> 
    <widget class="QWidget" name="centralwidget"> 
    <layout class="QVBoxLayout" name="verticalLayout"> 
    <item> 
    <widget class="QGraphicsView" name="graphicsView"/> 
    </item> 
    </layout> 
    </widget> 
    <widget class="QMenuBar" name="menubar"> 
    <property name="geometry"> 
    <rect> 
    <x>0</x> 
    <y>0</y> 
    <width>800</width> 
    <height>22</height> 
    </rect> 
    </property> 
    </widget> 
    <widget class="QStatusBar" name="statusbar"/> 
</widget> 
<resources/> 
<connections/> 
</ui> 

편집 :

보이는 것 같습니다. 일하다. 클릭 이벤트가 인계하는 것처럼 타원은 더 이상 움직일 수 없습니다. 어떤 아이디어?

import sys 
from PyQt4 import QtCore, QtGui, uic 


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

    def mousePressEvent(self, event): 
     position = QtCore.QPointF(event.scenePos()) 
     print "pressed here: " + str(position.x()) + ", " + str(position.y()) 
     self.update() 

    def mouseMoveEvent(self, event): 
     position = QtCore.QPointF(event.scenePos()) 
     print "moved here: " + str(position.x()) + ", " + str(position.y()) 
     self.update() 

    def mouseReleaseEvent(self, event): 
     position = QtCore.QPointF(event.scenePos()) 
     print "released here: " + str(position.x()) + ", " + str(position.y()) 
     self.update() 


class test(QtGui.QMainWindow): 

    def __init__(self): 
     QtGui.QMainWindow.__init__(self) 
     self.ui = uic.loadUi('test.ui', self) 

     self.scene = graphicsScene() 
     self.ui.graphicsView.setScene(self.scene) 

     pen = QtGui.QPen(QtCore.Qt.red) 
     brush = QtGui.QBrush(QtCore.Qt.blue) 
     e = self.scene.addEllipse(10,10,100,100, pen, brush) 
     e.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True) 

     self.ui.show() 


def main(): 
    app = QtGui.QApplication(sys.argv) 
    ui = test() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 

답변

3

mousePressEvent이고 다른 방법은 슬롯이 아닙니다. 이러한 방법에는 connect을 사용할 수 없습니다. 보기의 viewport()에 이벤트 필터를 설치하고 위젯의 eventFilter 메소드에서 이벤트를 catch해야합니다.

Event Filters을 참조하십시오.

+0

나는 그 방법에 "당신은 * 사용할 수 없습니다."라고 생각합니다. 또한'mousePressEvent()'를 오버라이드하는 것이 이벤트 필터를 설치하는 것보다 쉽고 빠릅니다. – jmk

+1

OP가'QGraphicsView'를 서브 클래스 화하고 뷰를 UI 파일의이 서브 클래스로 승격시켜야합니다. 그건 지나친 복창입니다. 뷰 동작을 변경하고 여러 클래스에서 해당 클래스를 다시 사용하려면'QGraphicsView'를 서브 클래 싱하는 것이 현명 할 것입니다. 나는 이것이 단순한 경우에 필요하지 않다고 가정한다. –

+0

나는 당신이 제안한대로했다고 생각합니다. 왜 내 타원을 채색에 대한 아이디어가 작동하지 않습니다? – waspinator

1

타원을 이동 가능하게 유지하려면 부모에게 이벤트를 전달해야합니다. 예를 들어 mouseMoveEvent의 경우,이 줄을 추가해야합니다 :

super(graphicsScene, self).mouseMoveEvent(event)