Hi. Plest help me  in this problem. In treeWidget I reimplement startDrag, 
dragMove and dragEnter. Result: drag indicator and dragPixmap disappeared. Drag 
from another widget or internal drag - does not matter. How to reimplement the 
procedure correctly to make drop indicator and drag pixmap work? 
setDropIndicatorShown(True) not work! 
In the example: Select "item0" in treeWidget, drag elements from listWidget to 
treeWidget. LeftMouse press and drag = select, MiddleMouse = Drag.
This code is functional. You can run and test.
Thanks!!!

from PyQt4.QtCore import *
from PyQt4.QtGui import *
#LIST WIDGET
class listWidgetClass(QListWidget):
    def __init__(self,  parent = None):
        QListWidget.__init__(self)
        self.parent = parent
        self.setSelectionMode(QAbstractItemView.ExtendedSelection)
        #####This command does not work
        self.setDropIndicatorShown(True)
        #####
        self.setDragEnabled(True)

    def mousePressEvent(self, event):
        if event.button() == 4:
            self.setDragDropMode(QAbstractItemView.DragOnly)
        else:
            self.setDragDropMode(QAbstractItemView.NoDragDrop)
        QListWidget.mousePressEvent(self, event)

    def startDrag(self, event):
        item = self.selectedItems()
        objects = []
        if item:
            for i in item:
                objects.append(str(i.text()))
        data = QByteArray()
        stream = QDataStream(data, QIODevice.WriteOnly)
        stream.writeQString(';'.join(objects))
        mimeData = QMimeData()
        mimeData.setData('application/x-dropWidget', data)
        drag = QDrag(self)
        drag.setMimeData(mimeData)
        drag.exec_()
#TREE WIDGET
class treeWidgetClass(QTreeWidget):
    def __init__(self,  parent = None):
        QTreeWidget.__init__(self)
        self.parent = parent
        self.setSelectionMode(QAbstractItemView.ExtendedSelection)
        self.setDragDropMode(QAbstractItemView.InternalMove)
        self.setAcceptDrops(True)
        self.setDragEnabled(True)
        self.header().setVisible(False)
        self.setDropIndicatorShown(True)
        self.setColumnCount(1)

    def addItems(self, objs, dropItem):
        if objs:
            sourceItem = self.currentItem()
            sourceData = 
str(sourceItem.data(0,Qt.UserRole).toString()).split(';')
            targetData = str(dropItem.data(0,Qt.UserRole).toString())
            if targetData:
                targetData = targetData.split(';')
            else:
                targetData = []
            dropData = objs.split(';')

            dropItem.setData(0,Qt.UserRole,';'.join(targetData+dropData))
            newSourceData = []
            for s in sourceData:
                if not s in dropData:
                    newSourceData.append(s)
            sourceItem.setData(0,Qt.UserRole,';'.join(newSourceData))

####################### it is an important part of the code 
######################
    def dragEnterEvent(self, event):
        if event.mimeData().hasFormat('application/x-dropWidget'):
            event.accept()
        else:
            event.ignore()

    def dragMoveEvent(self, event):
        if event.mimeData().hasFormat('application/x-dropWidget'):
            event.accept()
        else:
            event.ignore()
#############################################################################

    def dropEvent(self, event):
        QTreeWidget.dropEvent(self, event)
        if event.mimeData().hasFormat('application/x-dropWidget'):
            event.accept()
            data = event.mimeData().data('application/x-dropWidget')
            stream = QDataStream(data, QIODevice.ReadOnly)
            text = str(stream.readQString())
            if text:
                item = self.itemAt(event.pos())
                self.addItems(text, item)
                self.parent.updateList()

    def startDrag(self, dropActions):
        data = QByteArray()
        stream = QDataStream(data, QIODevice.WriteOnly)
        stream.writeQString('')
        mimeData = QMimeData()
        mimeData.setData('application/x-dropWidget', data)
        drag = QDrag(self)
        drag.setMimeData(mimeData)
        drag.exec_()

    def mousePressEvent(self,event):
        if  event.button() == 1:
            self.setDragDropMode(QAbstractItemView.DropOnly)
            QTreeWidget.mousePressEvent(self, event)
        elif event.button() == 4:
            self.setDragDropMode(QAbstractItemView.InternalMove)
            QTreeWidget.mousePressEvent(self, event)

    def mouseReleaseEvent(self, event):
        self.setDragDropMode(QAbstractItemView.InternalMove)
        QTreeWidget.mouseReleaseEvent(self, event)

#MAIN WIDGET
class dropWidget(QMainWindow):
    def __init__(self, parent = None):
        QMainWindow.__init__(self)
        self.resize(516, 282)
        self.centralwidget = QWidget(self)
        self.horizontalLayout = QHBoxLayout(self.centralwidget)
        self.treeWidget = treeWidgetClass(self)
        self.horizontalLayout.addWidget(self.treeWidget)
        self.listWidget = listWidgetClass(self)
        self.horizontalLayout.addWidget(self.listWidget)
        self.setCentralWidget(self.centralwidget)

        self.treeWidget.itemClicked.connect(self.updateList)
        self.initObjects()

    def updateList(self):
        data = self.treeWidget.currentItem().data(0,Qt.UserRole).toString()
        self.listWidget.clear()
        if data:
            for d in data.split(';'):
                item = QListWidgetItem(self.listWidget)
                item.setText(d)
                self.listWidget.addItem(item)

    def initObjects(self):
        for i in range(4):
            item = QTreeWidgetItem(self.treeWidget)
            item.setText(0,'Item '+str(i))
            self.treeWidget.addTopLevelItem(item)

        strings = []
        for i in range(10):strings.append('listItem'+str(i))
        data = ';'.join(strings)
        self.treeWidget.topLevelItem(0).setData( 0,  Qt.UserRole, 
QVariant(data) )

if __name__ == "__main__":
    app = QApplication([])
    win = dropWidget()
    win.show()
    app.exec_()

-- 
You received this message because you are subscribed to the Google Groups 
"Python Programming for Autodesk Maya" group.
To post to this group, send email to python_inside_maya@googlegroups.com.
To unsubscribe from this group, send email to 
python_inside_maya+unsubscr...@googlegroups.com.


Reply via email to