2014-02-17 35 views
0

如何在QCanvas上的點上使用拖放技術?我沒有在畫布上找到任何連接鼠標點擊的插槽。將一個點拖放到畫布上

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. 上發佈:更新最終狀態

在步驟2上,您還可以更新畫布。這是該技術的一個例子。我用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_()