Skip to content

Instantly share code, notes, and snippets.

@justinfx
Created October 11, 2012 18:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save justinfx/3874603 to your computer and use it in GitHub Desktop.
Save justinfx/3874603 to your computer and use it in GitHub Desktop.
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class ListOrderView(QListView):
itemMoved = pyqtSignal(int, int, QStandardItem)
def __init__(self, parent=None):
super(ListOrderView, self).__init__(parent)
self.setAcceptDrops(True)
self.setDragEnabled(True)
self.setDragDropMode(QAbstractItemView.InternalMove)
self.setDefaultDropAction(Qt.MoveAction)
self.dragItem = None
self.dragRow = None
def dropEvent(self, event):
print "Drop Event"
super(ListOrderView, self).dropEvent(event)
self.itemMoved.emit(self.dragRow, self.row(self.dragItem), self.dragItem)
self.dragItem = None
def dragEnterEvent(self, event):
print "Start Drag"
if event.proposedAction() == Qt.MoveAction:
event.acceptProposedAction()
self.dragItem = self.currentItem()
self.dragRow = self.row(self.dragItem)
return
super(ListOrderView, self).dragEnterEvent(event)
def currentItem(self):
index = self.currentIndex()
item = self.model().itemFromIndex(index)
return item
def row(self, item):
index = self.selectedIndexes()[0]
row = index.row()
return row
class ListOrderControl(QWidget):
def __init__(self, parent=None):
super(ListOrderControl, self).__init__(parent)
self.model = QStandardItemModel()
self.model.setSupportedDragActions(Qt.MoveAction)
self.listOrderView = ListOrderView()
self.listOrderView.setModel(self.model)
self.layout = QVBoxLayout(self)
self.layout.addWidget(self.listOrderView)
self.button = QPushButton("Print Model Info")
self.layout.addWidget(self.button)
for i in 'abcd':
self.addItem(i)
self.button.clicked.connect(self.printModelContents)
def addItem(self, string, select=False):
item = QStandardItem(string)
item.setDropEnabled(False)
self.model.appendRow(item)
if select:
self.listOrderView.selectionModel().setCurrentIndex(
self.model.indexFromItem(item),
QItemSelectionModel.ClearAndSelect)
def printModelContents(self):
print "[LISTCONTROL] item order is:"
for i in range(self.model.rowCount()):
text = self.model.item(i).text()
print "\t%s" % text
if __name__ == "__main__":
app = QApplication([])
win = ListOrderControl()
win.show()
win.raise_()
app.exec_()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment