PyQt5系列教程(30): QLineEdit 4

PyQt5系列教程(30): QLineEdit 4

这期我们继续介绍一下文本输入栏(QLineEdit),我们已经介绍了其常用属性、信号、函数还有自定义密码输入框,今天是最后一章,文本框自动补全。


若我们想用到QLineEdit自动补全的功能,必须要用到QCompleter类。


根据Qt官方文档上的介绍,QCompleter根据项目模型提供完成项。您可以使用QCompleter在任何Qt小部件中提供自动完成功能,例如QLineEdit和QComboBox。 当用户开始输入单词时,QCompleter根据单词列表提出完成单词的可能方法。 单词列表是作为QAbstractItemModel提供的。 (对于简单的应用程序,单词列表是静态的,您可以将List传递给QCompleter的构造函数。)


QCompleter的用法比较丰富,这里我们只涉及到最基本的使用,更多详细的用法我们会在后面的章节介绍。


核心源码

完成的最终效果是这样的:

self.m_model = QStandardItemModel(0, 1, self)
    m_completer = QCompleter(self.m_model, self)
    self.lineEdit_7.setCompleter(m_completer)
    m_completer.activated[str].connect(self.onEmailChoosed)
    
def onEmailChoosed(self, email):
    self.lineEdit_7.setText(email)

@pyqtSlot(str)
def on_lineEdit_7_textChanged(self, text):
    if '@' in self.lineEdit_7.text():
        return

    emaillist = [ "@163.com" , "@qq.com" , "@gmail.com" , "@live.com" , "@126.com", "@139.com"]
    self.m_model.removeRows(0, self.m_model.rowCount())
    for i in range(0, len(emaillist)):
        self.m_model.insertRow(0)
        self.m_model.setData(self.m_model.index(0, 0), text + emaillist[i])

这段代码主要分为四层意思:

  1. 新建QCompleter对象;
  2. 设置self.lineEdit_7.setCompleter();
  3. 选项被选择是应该如何操作:调用onEmailChoosed()槽函数;
  4. 如果self.lineEdit_7文本改变时该如何响应;
self.m_model = QStandardItemModel(0, 1, self)
m_completer = QCompleter(self.m_model, self)
self.lineEdit_7.setCompleter(m_completer)
m_completer.activated[str].connect(self.onEmailChoosed)

这里QStandardItemModel类为存储自定义数据提供了一个通用模型。

QStandardItemModel可以用作标准Qt数据类型的存储库。它是模型/视图类之一,是Qt的模型/视图框架的一部分。

QStandardItemModel提供了一个经典的基于项目的方法来处理模型。 QStandardItemModel中的项目由QStandardItem提供。

QStandardItemModel实现了QAbstractItemModel接口,这意味着该模型可用于在支持该接口的任何视图(如QListView,QTableView和QTreeView以及您自己的自定义视图)中提供数据。为了提高性能和灵活性,您可能希望子类QAbstractItemModel为不同类型的数据存储库提供支持。例如,QDirModel为底层文件系统提供了一个模型接口。

当你想要一个列表或树时,你通常会创建一个空的QStandardItemModel并使用appendRow()向模型添加项目,使用item()来访问项目。如果您的模型表示一个表格,您通常会将表格的维度传递给QStandardItemModel构造函数,并使用setItem()将项目放入表格中。您还可以使用setRowCount()和setColumnCount()来更改模型的尺寸。要插入项目,请使用insertRow()或insertColumn(),并删除项目,请使用removeRow()或removeColumn()。

您可以使用setHorizontalHeaderLabels()和setVerticalHeaderLabels()来设置模型的标题标签。

您可以使用findItems()在模型中搜索项目,并通过调用sort()对模型进行排序。

调用clear()从模型中移除所有项目。

self.m_model = QStandardItemModel(0, 1, self)

构造一个新的项目模型,该模型最初具有0行和1列,并且具有给定的父项。

m_completer = QCompleter(self.m_model, self)

用给定的父对象构造一个完成对象,该对象提供来自指定模型的完成对象,这里就是self.m_model。

self.lineEdit_7.setCompleter(m_completer)

将此行编辑设置为从完成者提供自动完成。要将QCompleter与QValidator或QLineEdit.inputMask一起使用,您需要确保提供给QCompleter的模型包含有效的条目。 您可以使用QSortFilterProxyModel来确保QCompleter的模型仅包含有效条目。

m_completer.activated[str].connect(self.onEmailChoosed)

当用户激活popup()的项目时(通过点击或按下返回键),发送此信号。 该项目的文本给出。这里表示我选择了具体的邮箱地址。

def onEmailChoosed(self, email):
    self.lineEdit_7.setText(email)

自动完成选项激活后,文本框内容设置为选择的电子邮件。

@pyqtSlot(str)
def on_lineEdit_7_textChanged(self, text):
    if '@' in self.lineEdit_7.text():
        return

    emaillist = [ "@163.com" , "@qq.com" , "@gmail.com" , "@live.com" , "@126.com", "@139.com"]
    for i in range(0, len(emaillist)):
        self.m_model.insertRow(0)
        self.m_model.setData(self.m_model.index(0, 0), text + emaillist[i])

这里我们将响应textChanged信号的函数写在下面,注意:

@pyqtSlot(str)
def on_lineEdit_7_textChanged(self, text):

这个是标准写法,不能随意改动,不同的信号响应会有不同的。这里我们会将文本栏中的内容传递过来。

if '@' in self.lineEdit_7.text():
    return

如果输入栏中已经存在@了,就不会在自动补全,因为已经没有意义了。没有谁见过xxx@@.com这种邮件地址。

emaillist = [ "@163.com" , "@qq.com" , "@gmail.com" , "@live.com" , "@126.com", "@139.com"]

邮件列表,我们自定义的。

self.m_model.removeRows(0, self.m_model.rowCount())
for i in range(0, len(emaillist)):
    self.m_model.insertRow(0)
    self.m_model.setData(self.m_model.index(0, 0), text + emaillist[i])

我们遍历邮件的列表,然后插入在m_model当中,并将其中的内容设置成我们输入内容和电子邮箱的合并。

需要将之前已经存在的数据清空才行。


最后

ok,今天的介绍就到这里吧,至此QLineEdit的介绍就到这里了。如果你喜欢本篇文章,请给我点赞

赞赏(推荐

分享给你的好友们吧!

关注微信公众号:学点编程吧,发送:pyqt530,你可以得到本期的源码!

编辑于 2019-04-19

文章被以下专栏收录

    承蒙各位学友们的支持,《Python图形界面编程》课程后推出后得到了1万多的学习量。课程推出后通过与广大学友的交流,本着对先前的课程进行进一步改进的想法(如:数据库操作、网络传输等均没有涉及),并结合当下Python3学习人员的日渐增多的情形,决定再推出一个PyQt5的教程,希望大家一起交流共同进步。