PyQt: cómo obtener la mayor parte de QListWidget

El código crea un cuadro de diálogo con un solo QListWidget y un solo QPushButton .

Al hacer clic en el botón se agrega un solo elemento de lista.

Al hacer clic con el botón derecho en un elemento de la lista, aparece el menú del botón derecho con el comando “Eliminar elemento” disponible.

Elegir el comando “Quitar elemento” elimina un elemento de lista del widget de lista.

Sería interesante ver cómo se podrían implementar las siguientes operaciones de ListWidgets:

  1. Posibilidad de mover los elementos de la lista hacia arriba y hacia abajo (reorganizar).
  2. Poder realizar una selección múltiple y eliminar elementos de la lista.
  3. Una mejor ordenación de elementos de lista más robusta.

Ejemplo:

import sys, os from PyQt4 import QtCore, QtGui class ThumbListWidget(QtGui.QListWidget): def __init__(self, type, parent=None): super(ThumbListWidget, self).__init__(parent) self.setAcceptDrops(True) self.setIconSize(QtCore.QSize(124, 124)) def dragEnterEvent(self, event): if event.mimeData().hasUrls: event.accept() else: event.ignore() def dragMoveEvent(self, event): if event.mimeData().hasUrls: event.setDropAction(QtCore.Qt.CopyAction) event.accept() else: event.ignore() def dropEvent(self, event): if event.mimeData().hasUrls: event.setDropAction(QtCore.Qt.CopyAction) event.accept() links = [] for url in event.mimeData().urls(): links.append(str(url.toLocalFile())) self.emit(QtCore.SIGNAL("dropped"), links) else: event.ignore() class Dialog_01(QtGui.QMainWindow): def __init__(self): super(QtGui.QMainWindow,self).__init__() self.listItems={} myQWidget = QtGui.QWidget() myBoxLayout = QtGui.QVBoxLayout() myQWidget.setLayout(myBoxLayout) self.setCentralWidget(myQWidget) self.myListWidget = ThumbListWidget(self) self.myListWidget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.myListWidget.connect(self.myListWidget, QtCore.SIGNAL("customContextMenuRequested(QPoint)" ), self.listItemRightClicked) myButton = QtGui.QPushButton("Add List Item") myBoxLayout.addWidget(self.myListWidget) myBoxLayout.addWidget(myButton) myButton.clicked.connect(self.addListWidgetItem) def addListWidgetItem(self): listItemName='Item '+str(len(self.listItems.keys())) self.listItems[listItemName]=None self.rebuildListWidget() def listItemRightClicked(self, QPos): self.listMenu= QtGui.QMenu() menu_item = self.listMenu.addAction("Remove Item") if len(self.listItems.keys())==0: menu_item.setDisabled(True) self.connect(menu_item, QtCore.SIGNAL("triggered()"), self.menuItemClicked) parentPosition = self.myListWidget.mapToGlobal(QtCore.QPoint(0, 0)) self.listMenu.move(parentPosition + QPos) self.listMenu.show() def menuItemClicked(self): if len(self.listItems.keys())==0: print 'return from menuItemClicked'; return currentItemName=str(self.myListWidget.currentItem().text() ) self.listItems.pop(currentItemName, None) self.rebuildListWidget() def rebuildListWidget(self): self.myListWidget.clear() items=self.listItems.keys() if len(items)>1: items.sort() for listItemName in items: listItem = QtGui.QListWidgetItem( listItemName, self.myListWidget ) self.listItems[listItemName]=listItem if __name__ == '__main__': app = QtGui.QApplication(sys.argv) dialog_1 = Dialog_01() dialog_1.show() dialog_1.resize(480,320) sys.exit(app.exec_()) 

Los elementos del widget de lista se pueden mover hacia arriba y hacia abajo mediante arrastrar y soltar, pero no está habilitado de forma predeterminada. Para encenderlo, haz esto:

  self.listWidget.setDragDropMode(QtGui.QAbstractItemView.InternalMove) 

La selección múltiple es uno de los varios modos de selección disponibles. Para encenderlo, haz esto:

  self.listWidget.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) 

La clasificación está deshabilitada por defecto. Para encenderlo, haz esto:

  self.listWidget.setSortingEnabled(True) 

Para reordenar la lista, realice una de estas acciones:

  self.listWidget.sortItems() # ascending by default self.listWidget.sortItems(QtCore.Qt.DescendingOrder) 

La clasificación es alfabética y no distingue entre mayúsculas y minúsculas de forma predeterminada. Si desea un orden de clasificación personalizado, subclase QListWidgetItem y vuelva a implementar su operador menor que:

 class ListWidgetItem(QtGui.QListWidgetItem): def __lt__(self, other): return self.text() < other.text() # or whatever