2014-02-17 3 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_() 
Смежные вопросы