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()
나는 그 방법에 "당신은 * 사용할 수 없습니다."라고 생각합니다. 또한'mousePressEvent()'를 오버라이드하는 것이 이벤트 필터를 설치하는 것보다 쉽고 빠릅니다. – jmk
OP가'QGraphicsView'를 서브 클래스 화하고 뷰를 UI 파일의이 서브 클래스로 승격시켜야합니다. 그건 지나친 복창입니다. 뷰 동작을 변경하고 여러 클래스에서 해당 클래스를 다시 사용하려면'QGraphicsView'를 서브 클래 싱하는 것이 현명 할 것입니다. 나는 이것이 단순한 경우에 필요하지 않다고 가정한다. –
나는 당신이 제안한대로했다고 생각합니다. 왜 내 타원을 채색에 대한 아이디어가 작동하지 않습니다? – waspinator