QCompleter 类

QCompleter 类根据项目模型提供补全功能。 更多...

头文件 #include <QCompleter>
CMakefind_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmakeQT += widgets
继承 QObject

公开类型

枚举CompletionMode { PopupCompletion, InlineCompletion, UnfilteredPopupCompletion }
枚举ModelSorting { UnsortedModel, CaseSensitivelySortedModel, CaseInsensitivelySortedModel }

属性

公开函数

QCompleter(QObject *parent = nullptr)
QCompleter(QAbstractItemModel *model, QObject *parent = nullptr)
QCompleter(const QStringList &list, QObject *parent = nullptr)
虚拟~QCompleter() override
Qt::CaseSensitivitycaseSensitivity() const
intcompletionColumn() const
intcompletionCount() const
QCompleter::CompletionModecompletionMode() const
QAbstractItemModel *completionModel() const
QStringcompletionPrefix() const
intcompletionRole() const
QStringcurrentCompletion() const
QModelIndexcurrentIndex() const
intcurrentRow() const
Qt::MatchFlagsfilterMode() const
intmaxVisibleItems() const
QAbstractItemModel *model() const
QCompleter::ModelSortingmodelSorting() const
virtual QStringpathFromIndex(const QModelIndex &index) const
QAbstractItemView *popup() const
voidsetCaseSensitivity(Qt::CaseSensitivity caseSensitivity)
voidsetCompletionColumn(int column)
voidsetCompletionMode(QCompleter::CompletionMode mode)
voidsetCompletionRole(int role)
boolsetCurrentRow(int row)
voidsetFilterMode(Qt::MatchFlags filterMode)
voidsetMaxVisibleItems(int maxItems)
voidsetModel(QAbstractItemModel *model)
voidsetModelSorting(QCompleter::ModelSorting sorting)
voidsetPopup(QAbstractItemView *popup)
voidsetWidget(QWidget *widget)
virtual QStringListsplitPath(const QString &path) const
QWidget *widget() const
boolwrapAround() const

公共槽函数

voidcomplete(const QRect &rect = QRect())
voidsetCompletionPrefix(const QString &prefix)
voidsetWrapAround(bool wrap)

信号

voidactivated(const QString &text)
voidactivated(const QModelIndex &index)
voidhighlighted(const QString &text)
voidhighlighted(const QModelIndex &index)

重写的受保护函数

virtual boolevent(QEvent *ev) override
virtual booleventFilter(QObject *o, QEvent *e) override

详细信息

您可以使用 QCompleter 为任何 Qt 小部件提供自动完成功能,例如 QLineEditQComboBox。当用户开始输入单词时,QCompleter 根据单词列表建议可能的完成方式。单词列表以 QAbstractItemModel 的形式提供。(对于单词列表是静态的简单应用程序,您可以将 QStringList 传递给 QCompleter 构造函数。)

基本用法

通常将 QCompleter 与 QLineEditQComboBox 配合使用。例如,下面是如何在 QLineEdit 中提供来自简单单词列表的自动完成功能:

QStringList wordList;
wordList << "alpha" << "omega" << "omicron" << "zeta";

QLineEdit *lineEdit = new QLineEdit(this);

QCompleter *completer = new QCompleter(wordList, this);
completer->setCaseSensitivity(Qt::CaseInsensitive);
lineEdit->setCompleter(completer);

可以使用 QFileSystemModel 来提供文件名自动完成功能。例如:

QCompleter *completer = new QCompleter(this);
completer->setModel(new QFileSystemModel(completer));
lineEdit->setCompleter(completer);

要通过 QCompleter 操作的模型设置模型,请调用 setModel。默认情况下,QCompleter 将尝试将 completion prefix(即用户已开始的单词)与模型中列 0 存储的 Qt::EditRole 数据进行敏感匹配。这可以通过 setCompletionRolesetCompletionColumnsetCaseSensitivity 来更改。

如果模型是根据用于完成操作的列和角色排序的,则可以使用setModelSorting() 方法,将QCompleter::CaseSensitivelySortedModelQCompleter::CaseInsensitivelySortedModel 作为参数调用。在大型模型上,这可以带来显著的性能提升,因为QCompleter可以使用二分查找而不是线性查找。二分查找仅在filterModeQt::MatchStartsWith 时工作。

该模型可以是列表模型表格模型树模型。在树模型上的完成操作较为复杂,下面在处理树模型部分进行介绍。

completionMode() 决定了用于向用户提供补全内容的方式。

遍历补全结果

要检索单个候选项字符串,请用需要补全的文本调用setCompletionPrefix(),然后调用currentCompletion()。您可以如下遍历补全列表

for (int i = 0; completer->setCurrentRow(i); i++)
    qDebug() << completer->currentCompletion() << " is match number " << i;

completionCount() 返回当前前缀的补全总数。应尽可能避免使用completionCount(),因为它要求扫描整个模型。

补全模型

completionModel() 返回一个包含所有可能的补全项的列表模型,其顺序与它们在模型中出现的顺序相同。此模型可以用来自定义视图显示当前补全项。调用setCompletionPrefix() 将自动刷新补全模型。

处理树模型

如果任何项(或子项或子子项)可以明确地通过指定项的路径作为字符串表示,则QCompleter可以在树模型中查找补全过程。补全操作将逐级进行。

以用户输入文件系统路径的例子来说。模型是一个(分层)QFileSystemModel。补全将在路径的每个元素上进行。例如,如果当前文本为C:\Wind,则QCompleter可能会建议使用Windows来完善当前路径元素。同样,如果当前文本为C:\Windows\Sy,则QCompleter可能会建议使用System

为了使这类补全有效,QCompleter需要能够将路径拆分为字符串列表,这些字符串在每级上匹配。对于C:\Windows\Sy,它需要拆分为 "C:"、"Windows" 和 "Sy"。splitPath() 的默认实现,如果模型是QFileSystemModel,将使用QDir::separator()来拆分completionPrefix

为了提供补全内容,QCompleter需要知道从索引到路径的路径。这由pathFromIndex() 提供。pathFromIndex() 的默认实现,对于列表模型返回编辑角色数据,对于模式为QFileSystemModel的模式返回绝对文件路径。

另请参阅 QAbstractItemModelQLineEditQComboBoxCompleter Example

成员类型文档

枚举 QCompleter::CompletionMode

此枚举指定如何向用户提供补全。

常量描述
QCompleter::PopupCompletion0当前补全显示在弹出窗口中。
QCompleter::InlineCompletion2补全以行内形式(作为所选文本)出现。
QCompleter::UnfilteredPopupCompletion1所有可能的补全都显示在包含最大可能性建议项的弹出窗口中。

另请参阅setCompletionMode

枚举 QCompleter::ModelSorting

此枚举指定模型中项的排序方式。

常量描述
QCompleter::UnsortedModel0模型未排序。
QCompleter::CaseSensitivelySortedModel1模型按字母顺序排序。
QCompleter::CaseInsensitivelySortedModel2模型不区分大小写排序。

另请参阅setModelSorting

属性文档

caseSensitivity : Qt::CaseSensitivity

此属性保留匹配的大小写敏感性

默认值是 Qt::CaseSensitive

访问函数

Qt::CaseSensitivitycaseSensitivity() const
voidsetCaseSensitivity(Qt::CaseSensitivity caseSensitivity)

另请参阅completionColumncompletionRolemodelSortingfilterMode

completionColumn : int

此属性保留在模型中搜索补全的列。

如果 popup() 是一个 QListView,它会自动配置以显示此列。

默认情况下,匹配列是 0。

访问函数

intcompletionColumn() const
voidsetCompletionColumn(int column)

另请参阅completionRolecaseSensitivity

completionMode : CompletionMode

用户接收补全的方式

默认值是 QCompleter::PopupCompletion

访问函数

QCompleter::CompletionModecompletionMode() const
voidsetCompletionMode(QCompleter::CompletionMode mode)

completionPrefix : QString

此属性保留用于提供补全的补全前缀。

completionModel() 更新以反映前缀的可能匹配项列表。

访问函数

QStringcompletionPrefix() const
voidsetCompletionPrefix(const QString &prefix)

completionRole : int

此属性保留用于查询项目内容的匹配项的角色。

默认角色是 Qt::EditRole

访问函数

intcompletionRole() const
voidsetCompletionRole(introle)

另请参阅 completionColumncaseSensitivity

filterMode : Qt::MatchFlags

此属性用于控制过滤操作的方式。

如果将filterMode设置为Qt::MatchStartsWith,则仅显示以输入的字符开头的条目。如果设置为Qt::MatchContains,则显示包含输入字符的条目;如果设置为Qt::MatchEndsWith,则显示以输入字符结尾的条目。

将filterMode设置为任何其他Qt::MatchFlag将发出警告,且不会执行任何操作。因此,Qt::MatchCaseSensitive标志无效果。使用caseSensitivity属性来控制大小写敏感性。

默认模式是Qt::MatchStartsWith

访问函数

Qt::MatchFlagsfilterMode() const
voidsetFilterMode(Qt::MatchFlags filterMode)

另请参阅 caseSensitivity

maxVisibleItems : int

此属性表示补全器在屏幕上允许的最大项目数量。

默认值是7。

访问函数

intmaxVisibleItems() const
voidsetMaxVisibleItems(int maxItems)

modelSorting : ModelSorting

此属性表示模型排序的方式。

默认情况下,不假设提供补全模型的项目顺序。

如果模型的completionColumn()和completionRole()数据按升序排序,可以将此属性设置为CaseSensitivelySortedModelCaseInsensitivelySortedModel。在大型模型上,这可以实现显著的性能提升,因为补全对象可以使用二分查找算法而不是线性查找算法。

模型排序顺序(即升序或降序)通过检查模型内容按动态确定。

注意:当补全的caseSensitivity与模型排序时使用的敏感度不同时,上述性能改进不能实现。

访问函数

QCompleter::ModelSortingmodelSorting() const
voidsetModelSorting(QCompleter::ModelSorting sorting)

另请参阅 setCaseSensitivity() 和 QCompleter::ModelSorting

wrapAround : bool

当浏览条目时,此属性表示补全项是否循环。

默认值为true。

访问函数

boolwrapAround() const
voidsetWrapAround(bool wrap)

成员函数文档

QCompleter::QCompleter(QObject *parent = nullptr)

使用指定的parent构造一个补全过程对象。

QCompleter::QCompleter(QAbstractItemModel *model, QObject *parent = nullptr)

使用指定的 model 构建一个具有给定 parent 的补全对象。

QCompleter::QCompleter(const QStringList &list, QObject *parent = nullptr)

使用指定的 list 作为可能的补全长度的来源,构建一个 QCompleter 对象。

[重写虚函数 noexcept] QCompleter::~QCompleter()

销毁补全对象。

[信号] void QCompleter::activated(const QString &text)

当用户通过点击或按回车激活 popup() 中的某个项时,发送此信号。提供了该项的 text

注意:类中重载了信号 activated。为了使用函数指针语法连接到此信号,Qt 提供了一个方便的辅助函数,如下例所示

connect(completer, QOverload<const QString &>::of(&QCompleter::activated),
    [=](const QString &text){ /* ... */ });

[信号] void QCompleter::activated(const QModelIndex &index)

当用户通过点击或按回车激活 popup() 中的某个项时,发送此信号。(点击或按回车)。提供了该项在 completionModel() 中的 index

注意:类中重载了信号 activated。为了使用函数指针语法连接到此信号,Qt 提供了一个方便的辅助函数,如下例所示

connect(completer, QOverload<const QModelIndex &>::of(&QCompleter::activated),
    [=](const QModelIndex &index){ /* ... */ });

[槽函数] void QCompleter::complete(const QRect &rect = QRect())

对于 QCompleter::PopupCompletion 和 QCompletion::UnfilteredPopupCompletion 模式,调用此函数显示显示当前补全的弹出窗口。默认情况下,如果未指定 rect,则弹出窗口显示在 widget() 的底部。如果指定了 rect,则弹出窗口显示在矩形的左侧边缘。

对于 QCompleter::InlineCompletion 模式,会触发 highlighted() 信号,带有当前补全。

int QCompleter::completionCount() const

返回当前前缀的补全数量。对于具有大量项的未排序模型,这可能很昂贵。使用 setCurrentRow() 和 currentCompletion() 来遍历所有补全。

QAbstractItemModel *QCompleter::completionModel() const

返回补全模型。补全模型是一个只读列表模型,包含所有可能的当前补全前缀匹配项。补全模型会自动更新以反映当前补全。

注意:此函数的返回值定义为 QAbstractItemModel 以提供通用性。实际返回的模型类型是一个 QAbstractProxyModel 子类的实例。

另请参阅:completionPrefixmodel

QString QCompleter::currentCompletion() const

返回当前补全字符串。这包括completionPrefix。当与setCurrentRow()一起使用时,可以用来遍历所有匹配项。

另请参阅setCurrentRow() 和 currentIndex

QModelIndex QCompleter::currentIndex() const

返回completionModel中当前补全的模型索引。

另请参阅setCurrentRowcurrentCompletionmodel

int QCompleter::currentRow() const

返回当前行。

另请参阅setCurrentRow

[覆盖虚受保护] bool QCompleter::event(QEvent *ev)

重实现: QObject::event(QEvent *e)。

[覆盖虚受保护] bool QCompleter::eventFilter(QObject *o, QEvent *e)

重实现: QObject::eventFilter(QObject *watched, QEvent *event)。

[信号] void QCompleter::highlighted(const QString &text)

当用户突出显示popup()中的项时,将发送此信号。如果使用设置有completionMode()为QCompleter::InlineCompletioncomplete()调用,也会发送此信号。给出项的text

注意:此类中信号highlighted被重载。如果要使用函数指针语法连接到此信号,Qt提供了方便的辅助函数,如下例所示。

connect(completer, QOverload<const QString &>::of(&QCompleter::highlighted),
    [=](const QString &text){ /* ... */ });

[信号] void QCompleter::highlighted(const QModelIndex &index)

当用户突出显示popup()中的项时,将发送此信号。如果使用设置有completionMode()为QCompleter::InlineCompletioncomplete()调用,也会发送此信号。给出项在completionModel()中的index

注意:此类中信号highlighted被重载。如果要使用函数指针语法连接到此信号,Qt提供了方便的辅助函数,如下例所示。

connect(completer, QOverload<const QModelIndex &>::of(&QCompleter::highlighted),
    [=](const QModelIndex &index){ /* ... */ });

QAbstractItemModel *QCompleter::model() const

返回提供补全字符串的模型。

另请参阅setModel()和completionModel

[虚拟] QString QCompleter::pathFromIndex(const QModelIndex &index) const

返回给定 index 的路径。补全对象使用这个路径从底层模型中获取补全文本。

默认实现返回列表模型的项目的 编辑角色。如果模型是 QFileSystemModel,则返回绝对文件路径。

另请参阅splitPath

返回用于显示补全项的弹出窗口。

另请参阅setPopup

bool QCompleter::setCurrentRow(int row)

将当前行设置为指定的 row。如果成功,返回 true;否则返回 false

此函数可以与 currentCompletion() 一起使用来遍历所有可能的补全项。

另请参阅currentRowcurrentCompletioncompletionCount

void QCompleter::setModel(QAbstractItemModel *model)

设置提供补全的模型为 model。该模型可以是列表模型或树模型。如果已设置了模型并且该模型将 QCompleter 作为其父项,则将其删除。

为了方便,如果 modelQFileSystemModel,则 QCompleter 在 Windows 上将 caseSensitivity 切换到 Qt::CaseInsensitive,在其他平台上切换到 Qt::CaseSensitive

另请参阅completionModelmodelSortingHandling Tree Models

void QCompleter::setPopup(QAbstractItemView *popup)

将用于显示补全项的弹出窗口设置为 popupQCompleter 获取对该视图的所有权。

当将 completionMode() 设置为 QCompleter::PopupCompletionQCompleter::UnfilteredPopupCompletion 时,自动创建 QListView。默认的弹出窗口显示 completionColumn

请在此修改视图设置之前调用此函数。这是必需的,因为视图的属性可能要求在视图中设置模型(例如,隐藏视图中的列需要在视图中设置模型)。

另请参阅popup

void QCompleter::setWidget(QWidget *widget)

指定提供补全的控件为 widget。当在 QCompleter 上设置 QLineEdit 使用 QLineEdit::setCompleter() 或在 QComboBox 上使用 QComboBox::setCompleter() 时,此函数将自动被调用。当为自定义控件提供补全时,需要显式设置控件。

另请参阅widget(),setModel() 和 setPopup()。

[virtual] QStringList QCompleter::splitPath(const QString &path) const

将指定的 path 分割成字符串,用于在每个层中与 model 匹配。

splitPath() 的默认实现是在 sourceModel() 是 QFileSystemModel 时,根据 QDir::separator() 分割文件系统路径。

当与列表模型一起使用时,返回列表中的第一个项目用于匹配。

另请参阅pathFromIndex() 和 处理树形模型

QWidget *QCompleter::widget() const

返回补全对象提供补全的控件。

另请参阅setWidget()。

© 2024 The Qt Company Ltd. 本文档中包含的贡献的版权归其各自的所有者。提供的文档受 GNU 自由文档许可证版本 1.3 的许可,该许可证由自由软件基金会发布。Qt 和相应的标志是 The Qt Company Ltd. 在芬兰以及全球其他国家的商标。所有其他商标均为其各自所有者的财产。