dropEvent () не вызывается - PullRequest
       7

dropEvent () не вызывается

0 голосов
/ 12 ноября 2010

Я пытаюсь выполнить операцию перетаскивания из QTreeWidget в QGraphicsView. dragStart () работает, и dragEnterEvent () работает, но dropEvent () никогда не вызывается. Также растровое изображение не отображается, пока курсор не войдет в QGraphicsView, что не является проблемой, но я просто подумал, что оно появится, как только начнется перетаскивание. Вот моя функция startDrag:

def on_list_startDrag(self, supportedActions):
    #Retreive the item that was clicked on
    currentPart = self.ui.list.currentItem()
    part = currentPart.text(0)

    drag = QtGui.QDrag(self.ui.list)
    mime = QtCore.QMimeData()
    print(part)
    #retreive that associated graphics file
    icon = QtGui.QIcon('drawings/FULL/' + part + '.svg')
    pixmap = icon.pixmap(102,122)

    selected = QtGui.QImage('drawings/FULL/' + part + '.svg')
    data = pickle.dumps(selected)

    mime.setData('application/x-item', data)
    #mime.setImageData(QtGui.QImage('drawings/FULL/' + part + '.svg'))
    drag.setMimeData(mime)
    drag.setHotSpot(QtCore.QPoint(pixmap.width()/2, pixmap.height()/2))
    drag.setPixmap(pixmap)
    drag.exec_()

Вот это dragEnterEvent:

def on_workArea_dragEnterEvent(self, event):
    print(event.format())
    if (event.mimeData().hasFormat('application/x-item')):
        event.accept()
        print('accepted')
    else:
        event.ignore()

Наконец код dropEvent:

def on_workArea_dropEvent(self, event):
    print('dropped')

Когда я запускаю операцию перетаскивания, курсор имеет кружок с косой чертой, как виджет не принимает капли, но я установил QGraphicsView, workArea, чтобы принимать капли. Может кто-нибудь, пожалуйста, помогите мне заставить работать каплю и объяснить, почему растровое изображение не отображается за курсором, пока курсор не находится над QGraphicsView. Спасибо.

Ответы [ 2 ]

3 голосов
/ 29 августа 2012

Вам также нужно реализовать dragMoveEvent(), иначе dropEvent() не будет вызван.Это также заставляет его отображать правильный значок выпадения, а не пунктирный кружок «не можете здесь сбросить».

0 голосов
/ 13 ноября 2010

Я проверил ваш код, и он выглядит и работает нормально для меня; оба dropEvent и pixmap работают как положено. Возможно, в вашем коде есть что-то еще, что вызывает нежелательное поведение, которое вы описываете. Что касается dropEvent, у вас могут быть проблемы с подключением слота к сигналу, что приводит к тому, что ваш код не вызывается. Я сделал небольшой пример, который перетаскивает между древовидным и графическим представлениями и загружает и представляет растровое изображение:

import sys
from PyQt4 import QtGui, QtCore

class TestTreeView(QtGui.QTreeView):
    def __init__(self, parent = None):
        super(TestTreeView, self).__init__(parent)
        self.setDragEnabled(True)

    def startDrag(self, dropAction):
        print('tree start drag')

        icon = QtGui.QIcon('/home/image.png')
        pixmap = icon.pixmap(64, 64)

        mime = QtCore.QMimeData()
        mime.setData('application/x-item', '???')

        drag = QtGui.QDrag(self)
        drag.setMimeData(mime)        
        drag.setHotSpot(QtCore.QPoint(pixmap.width()/2, pixmap.height()/2))
        drag.setPixmap(pixmap)        
        drag.start(QtCore.Qt.CopyAction)

class TestGraphicsView(QtGui.QGraphicsView): 
    def __init__(self, parent = None):
        super(TestGraphicsView, self).__init__(parent)
        self.setAcceptDrops(True)

    def dragEnterEvent(self, event):
        print('graphics view drag enter')
        if (event.mimeData().hasFormat('application/x-item')):
            event.acceptProposedAction()
            print('accepted')
        else:
            event.ignore()    

    def dropEvent(self, event): 
        print('graphics view drop')
        event.acceptProposedAction()                 

class MainForm(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainForm, self).__init__(parent)

        self.model = QtGui.QStandardItemModel()

        for k in range(0, 4):
            parentItem = self.model.invisibleRootItem()
            for i in range(0, 4):
                item = QtGui.QStandardItem(QtCore.QString("item %0 %1").arg(k).arg(i))
                parentItem.appendRow(item)
                parentItem = item

        self.setMinimumSize(300, 400)

        self.view = TestTreeView(self)
        self.view.setModel(self.model)
        self.view.setMinimumSize(300, 200)

        self.graphicsView = TestGraphicsView(self)
        self.graphicsView.setGeometry(0, 210, 300, 400)        

        self.layout = QtGui.QVBoxLayout(self.centralWidget())        
        self.layout.addWidget(self.view)
        self.layout.addWidget(self.graphicsView)

def main():
    app = QtGui.QApplication(sys.argv)
    form = MainForm()
    form.show()
    app.exec_()

if __name__ == '__main__':
    main() 

надеюсь, это поможет, с уважением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...