Не могу добить пример. Документация, ссылка на которую здесь была приведена выше, практически не помогает, т.к. слишком много общих слов и нет примеров. В результате просто передрал некоторые идеи из примера “dragdroprobot.pyw” (который идёт с PyQt4) и застрял.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtGui, QtCore
class MainWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setGeometry(300, 300, 600, 500)
# создание сцены для отображения элементов-рисунков:
self.scene = Scene()
# создание виджета представления для отображения сцены:
view = QtGui.QGraphicsView(self.scene, self)
# параметры качества прорисовки для виджета представления:
view.setRenderHints(QtGui.QPainter.Antialiasing | QtGui.QPainter.SmoothPixmapTransform)
self.setCentralWidget(view) # размещение виджета представления в главном окне
# первый элемент:
item = Element(QtGui.QPixmap(u'011.jpg'), None, self.scene)
# второй элемент (с поворотом)
item2 = Element(QtGui.QPixmap(u'113.jpg'), None, self.scene)
item2.rotate(25) # поворот
item2.setOffset(100, -30) # смещение
class Scene(QtGui.QGraphicsScene):
def __init__(self, parent = None):
QtGui.QGraphicsScene.__init__(self, parent)
def dragEnterEvent(self, event):
print 'dragEnterEvent'
def dragLeaveEvent(self, event):
print 'dragLeaveEvent'
def dropEvent(self, event):
print 'dropEvent'
class Element(QtGui.QGraphicsPixmapItem):
def __init__(self, pixmap, parent = None, scene = None):
QtGui.QGraphicsPixmapItem.__init__(self, pixmap, parent, scene)
self.setTransformationMode(QtCore.Qt.SmoothTransformation) # качество прорисовки
self.setCursor(QtCore.Qt.OpenHandCursor) # вид курсора мыши над элементом
#self.setAcceptDrops(True)
def mousePressEvent(self, event):
if event.button() != QtCore.Qt.LeftButton: # только левая клавиша мыши
event.ignore()
return
drag = QtGui.QDrag(event.widget()) # объект Drag
mime = QtCore.QMimeData()
drag.setMimeData(mime)
drag.setPixmap(self.pixmap()) # рисунок, отображающийся в процессе переноса
drag.setHotSpot(QtCore.QPoint(80, 110)) # позиция "ухватки"
drag.start() # запуск (начало) перетаскивания
if __name__=="__main__":
app = QtGui.QApplication(sys.argv)
win = MainWindow()
win.show()
sys.exit(app.exec_())
Я унаследовал свои классы от QGraphicsPixmapItem и от QGraphicsScene. Перетаскивание начинается в процедуре mousePressEvent в классе QGraphicsPixmapItem, а закончится должно по идее где-то в QGraphicsScene (кстати, правильно ли это?).
Вопросы такие:
1. Как определить нужный Z-порядок элементов на сцене? Сама по себе она отрисовывает элементы как придётся.
2. Я запутался в том, что и где надо сделать в классе-наследнике QGraphicsScene, чтобы закончить перетаскивание. Обработчик dropEvent() у меня вообще ни черта не вызывается. И не понятно, как добраться до объекта QDrag, созданного при начале перетаскивания в классе-наследнике QGraphicsPixmapItem.
Добавлено позже:
Первый вопрос - нашёл сам. У объекта QGraphicsPixmapItem есть метод setZValue().