PyQt:如何充分利用QListWidget
这段代码创建了一个对话框,里面有一个QListWidget(列表控件)和一个QPushButton(按钮)。
点击这个按钮会在列表中添加一个新项目。
如果你右键点击列表中的某个项目,会出现一个右键菜单,里面有“移除项目”的选项。
选择“移除项目”这个选项,就可以把该项目从列表中删除。
接下来,看看以下这些功能怎么实现会很有意思:
- 可以上下移动列表项目(重新排列)。
- 能够多选并同时删除多个列表项目。
- 更好、更强大的列表项目排序功能。
示例:
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_())
1 个回答
23
列表小部件里的项目可以通过拖放的方式上下移动,但默认情况下这个功能是关闭的。要开启这个功能,可以这样做:
self.listWidget.setDragDropMode(QtGui.QAbstractItemView.InternalMove)
多选是几种可用的 选择模式 之一。要开启这个功能,可以这样做:
self.listWidget.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
默认情况下,排序功能是关闭的。要开启这个功能,可以这样做:
self.listWidget.setSortingEnabled(True)
要重新排序列表,可以选择以下任意一种方法:
self.listWidget.sortItems() # ascending by default
self.listWidget.sortItems(QtCore.Qt.DescendingOrder)
默认情况下,排序是按字母顺序进行的,并且不区分大小写。如果你想要自定义排序顺序,可以创建一个 QListWidgetItem
的子类,并重新实现它的“小于”操作符:
class ListWidgetItem(QtGui.QListWidgetItem):
def __lt__(self, other):
return self.text() < other.text() # or whatever