Qt5 Python GUI 编程指南
创建时间:2018-12-10  访问量:8819  9  0

Qt5 Python GUI 编程指南

在 List 部件中执行操作

在本节,你将学习到如何在List部件中的列表项上执行不同的操作。List 部件的基本使用就是显示一组类似的选项,并让用户能够选择他们想要的选项。因此,你就需要向List部件添加这些选项。当然,你也可能需要编辑List部件中的任何一个选项。你想要在List部件上执行更多的操作就是从中删除所有这些选项,清空List部件条目。在学习如何从List部件中添加、编辑和删除选项之前,让我们了解下列表项的概念。

准备

List Widget是由一些列表项组成的。这些列表项都是QListWidgetItem类的实例。这些列表项都可以使用insertItem()或者addItem()方法插入到List Widget部件中。列表项可能包含文本或图标形式并且可以选中或选中或取消选中。这些方法都是由后面提到的QListWidgetItem类提供的。

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中所有条目的:

  1. 打开Qt Designer,基于Dialog without Buttons模板新建一个应用,并拖动一个Label、Line Edit、4个Push Button和List Widget部件放到窗体上。

  2. 将Label部件的text属性设置为Enter an item。

  3. 将4个Push Button部件的text属性分别设置为Add、Edit、Delete和Delete All。

  4. 将4个Push Button的objectName属性分别设置为pushButtonAdd、pushButtonEdit、pushButtonDelete和pushButtonDeleteAll。

  5. 将文件保存为demoListWidgetOp.ui。

    窗体的显示如下截图所示:

    

    XML文件demoListWidgetOp.ui需要通过使用pyuic5命令工具转换成Python脚本文件。生成的Python脚本文本demoListWidgetOp.py在本书的源代码中可以看到。

  1. 新建一个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中的条目就变成空的了,如下截图所示: