在本节,你将学习到如何在List部件中的列表项上执行不同的操作。List 部件的基本使用就是显示一组类似的选项,并让用户能够选择他们想要的选项。因此,你就需要向List部件添加这些选项。当然,你也可能需要编辑List部件中的任何一个选项。你想要在List部件上执行更多的操作就是从中删除所有这些选项,清空List部件条目。在学习如何从List部件中添加、编辑和删除选项之前,让我们了解下列表项的概念。
List Widget是由一些列表项组成的。这些列表项都是QListWidgetItem类的实例。这些列表项都可以使用insertItem()或者addItem()方法插入到List Widget部件中。列表项可能包含文本或图标形式并且可以选中或选中或取消选中。这些方法都是由后面提到的QListWidgetItem类提供的。
让我们来看一下QListWidgetItem类中提供的一些方法:
setText():这个方法为列表项设置指定的值
checkState():这个方法会返回一个布尔值来表示列表项是checked还是unchecked状态
setHidden():当向这个方法传递一个布尔值true时就会隐藏此列表项
isHidden():如果此列表项是隐藏的就返回true
我们已经学习了如何向List Widget中添加选项。如果你想要编辑List Widget中已存在的项,或者你想要人List Widget中删除已存在的项,或者你想要删除List Widget中所有项的话,该怎么办?
让我们通过新建一个应用来学习在List Widget上执行不同的操作。这个应用将显示Line Edit,List Widget和一对Push Button部件。你可以通过在Line Edit中输入文本的方式来向List Widget中添加选项,然后单击Add按钮。同理,你可以通过单击List Widget中的一个条目来修改List Widget中的任何条目,然后单击Edit按钮。不仅仅这些,甚至可以通过单击Delete按钮删除List Widget中的任何项。
执行以下步骤来理解如何在List Widget条目上执行不同的操作的;这些项条目是如何可以从List Widget条目中添加、编辑和删除的;并且是如何清空List Widget中所有条目的:
打开Qt Designer,基于Dialog without Buttons模板新建一个应用,并拖动一个Label、Line Edit、4个Push Button和List Widget部件放到窗体上。
将Label部件的text属性设置为Enter an item。
将4个Push Button部件的text属性分别设置为Add、Edit、Delete和Delete All。
将4个Push Button的objectName属性分别设置为pushButtonAdd、pushButtonEdit、pushButtonDelete和pushButtonDeleteAll。
将文件保存为demoListWidgetOp.ui。
窗体的显示如下截图所示:
XML文件demoListWidgetOp.ui需要通过使用pyuic5命令工具转换成Python脚本文件。生成的Python脚本文本demoListWidgetOp.py在本书的源代码中可以看到。
新建一个callListWidgetOp.pyw的Python脚本,导入Python代码,demoListWidgetOp.py,使用能调用用户界面设计和List Widget中列表项的添加、删除和编辑。callListWidgetOp.pyw脚本代码如下所示:
import sys
from PyQt5.QtWidgets import QDialog, QApplication, QInputDialog,
QListWidgetItem
from demoListWidgetOp import *
class MyForm(QDialog):
def __init__(self):
super().__init__()
self.ui = Ui_Dialog()
self.ui.setupUi(self)
self.ui.listWidget.addItem('Ice Cream')
self.ui.listWidget.addItem('Soda')
self.ui.listWidget.addItem('Coffee')
self.ui.listWidget.addItem('Chocolate')
self.ui.pushButtonAdd.clicked.connect(self.addlist)
self.ui.pushButtonEdit.clicked.connect(self.editlist)
self.ui.pushButtonDelete.clicked.connect(self.delitem)
self.ui.pushButtonDeleteAll.clicked.connect
(self.delallitems)
self.show()
def addlist(self):
self.ui.listWidget.addItem(self.ui.lineEdit.text())
self.ui.lineEdit.setText('')
self.ui.lineEdit.setFocus()
def editlist(self):
row=self.ui.listWidget.currentRow()
newtext, ok=QInputDialog.getText(self, "Enter new text",
"Enter new text")
if ok and (len(newtext) !=0):
self.ui.listWidget.takeItem(self.ui.listWidget.
currentRow())
self.ui.listWidget.insertItem(row,
QListWidgetItem(newtext))
def delitem(self):
self.ui.listWidget.takeItem(self.ui.listWidget.
currentRow())
def delallitems(self):
self.ui.listWidget.clear()
if __name__=="__main__":
app = QApplication(sys.argv)
w = MyForm()
w.show()
sys.exit(app.exec_())
pushButtonAdd的clicked()事件与addList函数关联。同理,pushButtonEdit、pushButtonDelete和pushButtonDeleteAll的clicked()的事件对象分别与editList、delitem和delallitems函数相关联。那么,在单击任何一个按钮时,对应的函数就会被调用。这个addList函数会调用List Widget条目中的addItem()函数来添加在Line Edit中输入的文本。editlist函数使用List Widget中的currentRow方法来找到需要编辑的列表项。QInputDialog类中的getText()方法会被调用以提示用户输入新的文本或编辑文本。在单击对话框上的OK按钮后,当前列表项就会被这个对话框中输入的文本替换。delitem函数调用List Widget中的takeItem方法来删除当前行,即选中的列表项。delallitems函数调用List Widget中的clear方法来清空或删除List Widget中的所有列表项。
运行应用程序,你将看到一个空的List Widget,Line Edit和LIne Edit 部件中的Add按钮。向Line Edit部件中添加任何文本并单击Add 按钮将其添加到List Widget中。在向List Widget中添加了4个选项后,它将显示如下截图所示的窗体:
让我们向List Widget中添加更多的选项,Pizza,在Line Edit部件中输入Pizza并单击Add按钮。那么这个Pizza选项就会被添加到List Widget条目中了,如下截图所示:
假设我们想要编辑List Widget中的这个Pizza选项,单击List Widget中的Pizza条目并单击Edit按钮。在单击了Edit 按钮后,会弹出一个对话框提示你输入一个新的条目来替换Pizza条目。我们在对话框中输入Cold Drink,再单击OK按钮,如下截图所示:
在截图中你可以看到List Widget中的Pizza条目被替换成了文本Cold Drink:
为了删除List Widget中的条目,简单的单击List Widget中的条目,然后单击Delete按钮。让我们单击List Widget中的Coffee条目然后单击Delete按钮;这个Coffee条目就从List Widget中删除了,如下截图所示:
当单击Delete All按钮时,List Widget中的条目就变成空的了,如下截图所示: