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 [email protected].
To unsubscribe from this group, send email to
[email protected].