2014-02-17 2 views
0

QCanvas에있는 포인트에 끌어서 놓기 techniqe를 사용할 수 있습니까? 캔버스에서 마우스 클릭을 연결하는 슬롯을 찾을 수 없습니다.캔버스에 포인트 드래그 앤 드롭

class Canvas(QtGui.QWidget): 
    def __init__(self, parent): 
     super(Canvas, self).__init__(parent) 
     self.setGeometry(0,0,200,200) 

    def paintEvent(self, e): 
     qp = QtGui.QPainter() 
     qp.begin(self) 
     self.drawPoints(qp) 
     qp.end() 

    def drawPoints(self, qp): 
     qp.setPen(QtCore.Qt.red) 
     size = self.size() 

      #test 
     x = 0 
     y = 0 
     for k in range(0,150,2): 
      qp.drawPoint(x,y) 
      x += 5 
      y += 5 

    #get the click coordinates 
    def mousePressEvent(self, QMouseEvent): 
     print QMouseEvent.pos() 
+0

예제 코드를 게시 할 수 있습니까? –

+0

내 질문을 업데이트했습니다. – erbal

답변

1

드래그은 드롭 기술은 더 많거나 적은 같은 수 있습니다 :

클릭에
  1. : 드래그 객체 릴리스에
  2. 을 다시 그리기 : 드래그 객체 이동에
  3. 를 확인 업데이트 최종 상태

캔버스를 업데이트 할 수도 있습니다. 이것은 기술의 한 예입니다. 포인트를 관리하기 위해 numpy를 사용합니다 (당신을 귀찮게하지 마십시오).

from PyQt4 import QtGui,QtCore 
import numpy as np 

class Canvas(QtGui.QWidget): 

    DELTA = 10 #for the minimum distance   

    def __init__(self, parent): 
     super(Canvas, self).__init__(parent) 
     self.draggin_idx = -1   
     self.setGeometry(0,0,200,200) 
     self.points = np.array([[v*5,v*5] for v in range(75)], dtype=np.float)   

    def paintEvent(self, e): 
     qp = QtGui.QPainter() 
     qp.begin(self) 
     self.drawPoints(qp) 
     qp.end() 

    def drawPoints(self, qp): 
     qp.setPen(QtCore.Qt.red) 
     for x,y in self.points: 
      qp.drawPoint(x,y)   

    def _get_point(self, evt): 
     return np.array([evt.pos().x(),evt.pos().y()]) 

    #get the click coordinates 
    def mousePressEvent(self, evt): 
     if evt.button() == QtCore.Qt.LeftButton and self.draggin_idx == -1: 
      point = self._get_point(evt) 
      #dist will hold the square distance from the click to the points 
      dist = self.points - point 
      dist = dist[:,0]**2 + dist[:,1]**2 
      dist[dist>self.DELTA] = np.inf #obviate the distances above DELTA 
      if dist.min() < np.inf: 
       self.draggin_idx = dist.argmin()   

    def mouseMoveEvent(self, evt): 
     if self.draggin_idx != -1: 
      point = self._get_point(evt) 
      self.points[self.draggin_idx] = point 
      self.update() 

    def mouseReleaseEvent(self, evt): 
     if evt.button() == QtCore.Qt.LeftButton and self.draggin_idx != -1: 
      point = self._get_point(evt) 
      self.points[self.draggin_idx] = point 
      self.draggin_idx = -1 
      self.update()   

app = QtGui.QApplication([]) 

c = Canvas(None) 
c.show() 
app.exec_()