2014-11-12 1 views
4

큰 사각형과 내부에 작은 사각형이있는 Qt (Python의 PySide 바인딩 사용)에 QGraphicsPathItem이 있습니다. 기본 채우기 규칙 (Qt.OddEvenFill)으로 인해 내부 사각형이 투명합니다. 이것은 효과적으로 구멍이있는 모양을 그립니다.QGraphicsItem에서 구멍이있는 도형에 마우스를 가져 가면 어떻게됩니까?

이제 enter, leave, click ...와 같은 마우스 이벤트를 듣고 싶습니다. .. QGraphicsItem을 구현하는 간단한 방법은 구멍이 여전히 일부이기 때문에 마우스 이벤트를 만들지 않습니다. 항목이 채워지지 않더라도.

윤곽선이 QPainterPath 또는 하나 또는 여러 개의 다각형으로 정의되고 구멍을 가질 수있는 사용자 정의 모양을 표시하고 마우스가 구멍에 들어가면 모양 외부로 간주되는 모양을 표시 할 파생물을 갖고 싶습니다.

이 구멍

예 모양 (마우스 내부 사각형 인 경우가 형상 및 마우스 휴가 이벤트 외부로 간주되어야가 실행되어야 함) :

Shape with a hole

그러나이 솔루션은해야 구멍이있는 임의의 모양에 대해 작업합니다. 주어진 위치를 특정 (내측) 경로 인 경우 PySide/파이썬 3.3

from PySide import QtCore, QtGui 

class MyPathItem(QtGui.QGraphicsPathItem): 

    def __init__(self): 
     super().__init__() 
     self.setAcceptHoverEvents(True) 

    def hoverEnterEvent(self, event): 
     print('inside') 

    def hoverLeaveEvent(self, event): 
     print('outside') 

app = QtGui.QApplication([]) 

scene = QtGui.QGraphicsScene() 
path = QtGui.QPainterPath() 
path.addRect(0, 0, 100, 100) 
path.addRect(25, 25, 50, 50) 

item = MyPathItem() 
item.setPath(path) 
item.setBrush(QtGui.QBrush(QtCore.Qt.blue)) 

scene.addItem(item) 

view = QtGui.QGraphicsView(scene) 
view.resize(200, 200) 
view.show() 

app.exec_() 

답변

2

은 기본적 returns the bounding rectangle으로 QGraphicsItem에서 그 방법 shape 보인다. 반환 된 경로는 위치가 복잡한 모양의 내부인지 외부인지를 결정하는 데 사용됩니다. 그러나 QGraphicsPathItem의 경우 이미 경로가 있으며 경계 사각형 대신이 값을 반환하면 문제가 해결 될 수 있습니다. 놀랍게도 그렇게합니다.

이 두 줄을 질문의 QGraphicsPathItem 파생어에 추가하기 만하면됩니다.

def shape(self): 
    return self.path() 
+0

결국 간단하지만 '모양'이 기본적으로 경계 사각형을 반환한다는 것을 모를 경우 조금 직관력이 떨어집니다. 그래서 여기에 질문을 남깁니다. – Trilarion

0

* 확장 가능 이벤트 핸들러

예 코드를 확인한다. 다른 접근법 - move/lineTo를 사용하여 그립니다 (아마도 모호합니다). 예를의 moveTo /에 lineTo의 경우 :

from PySide import QtCore, QtGui 

class MyPathItem(QtGui.QGraphicsPathItem): 

    def __init__(self): 
     QtGui.QGraphicsPathItem.__init__(self) 
     self.setAcceptHoverEvents(True) 

    def hoverEnterEvent(self, event): 
     print('inside') 

    def hoverLeaveEvent(self, event): 
     print('outside') 

app = QtGui.QApplication([]) 

scene = QtGui.QGraphicsScene() 

path = QtGui.QPainterPath() 
path.moveTo(0, 0) 
path.lineTo(100, 0) 
path.moveTo(0, 0) 
path.lineTo(0, 100) 
path.moveTo(100, 100) 
path.lineTo(0, 100) 
path.moveTo(100, 0) 
path.lineTo(100, 100) 

item = MyPathItem() 
pen = QtGui.QPen() 
pen.setWidth(25) 
pen.setColor(QtCore.Qt.blue) 
item.setPen(pen) 
item.setPath(path) 

scene.addItem(item) 

view = QtGui.QGraphicsView(scene) 
view.resize(200, 200) 
view.show() 

app.exec_() 
+0

첫 번째 아이디어의 경우 정확하게 수행하는 방법을 알지 못합니다. 두 번째로 나는 두꺼운 선들로 영역을 대체했기 때문에보다 관례적인 모양으로는 작동하지 않을 것이라고 생각합니다. 두께가 항상 일정하지 않은 경우는 어떨까요? – Trilarion

+0

첫 번째 아이디어는 훨씬 더 기발합니다. 구멍의 경로를 기억하고 moveEvent를 처리해야합니다. https://deptinfo-ensip.univ-poitiers.fr/ENS/pyside-docs/PySide/QtGui/QGraphicsItem.html#PySide.QtGui.PySide .QtGui.QGraphicsItem.hoverMoveEvent – kwarunek