QCompleter Class

QCompleter 类基于项目模型提供补全功能。更多

Header: #include <QCompleter>
CMake: find_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmake: QT += widgets
继承: QObject

公共类型

enum CompletionMode { PopupCompletion, InlineCompletion, UnfilteredPopupCompletion }
enum ModelSorting { UnsortedModel, CaseSensitivelySortedModel, CaseInsensitivelySortedModel }

属性

公共职能

QCompleter(QObject *parent = nullptr)
QCompleter(QAbstractItemModel *model, QObject *parent = nullptr)
QCompleter(const QStringList &list, QObject *parent = nullptr)
virtual ~QCompleter() override
Qt::CaseSensitivity caseSensitivity() const
int completionColumn() const
int completionCount() const
QCompleter::CompletionMode completionMode() const
QAbstractItemModel *completionModel() const
QString completionPrefix() const
int completionRole() const
QString currentCompletion() const
QModelIndex currentIndex() const
int currentRow() const
Qt::MatchFlags filterMode() const
int maxVisibleItems() const
QAbstractItemModel *model() const
QCompleter::ModelSorting modelSorting() const
virtual QString pathFromIndex(const QModelIndex &index) const
QAbstractItemView *popup() const
void setCaseSensitivity(Qt::CaseSensitivity caseSensitivity)
void setCompletionColumn(int column)
void setCompletionMode(QCompleter::CompletionMode mode)
void setCompletionRole(int role)
bool setCurrentRow(int row)
void setFilterMode(Qt::MatchFlags filterMode)
void setMaxVisibleItems(int maxItems)
void setModel(QAbstractItemModel *model)
void setModelSorting(QCompleter::ModelSorting sorting)
void setPopup(QAbstractItemView *popup)
void setWidget(QWidget *widget)
virtual QStringList splitPath(const QString &path) const
QWidget *widget() const
bool wrapAround() const

公共插槽

void complete(const QRect &rect = QRect())
void setCompletionPrefix(const QString &prefix)
void setWrapAround(bool wrap)

信号

void activated(const QModelIndex &index)
void activated(const QString &text)
void highlighted(const QModelIndex &index)
void highlighted(const QString &text)

重新实现的受保护函数

virtual bool event(QEvent *ev) override
virtual bool eventFilter(QObject *o, QEvent *e) override

详细说明

您可以使用 QCompleter 在任何 Qt Widget(如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 数据进行匹配,并区分大小写。这可以通过setCompletionRole(),setCompletionColumn() 和setCaseSensitivity() 进行更改。

如果模型是根据用于完成的列和角色排序的,可以使用QCompleter::CaseSensitivelySortedModelQCompleter::CaseInsensitivelySortedModel 作为参数调用setModelSorting() 。对于大型模型,这可以显著提高性能,因为 QCompleter 可以使用二进制搜索而不是线性搜索。二进制搜索只在filterModeQt::MatchStartsWith 时起作用。

模型可以是一个list model 、一个table model 或一个tree model 。树状模型的完成稍微复杂一些,将在下文Handling Tree Models 部分介绍。

completionMode() 决定用于向用户提供补全的模式。

迭代完成

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

for(inti= 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() 的默认实现,对于列表模式,会返回edit role 的数据,如果模式是QFileSystemModel ,则会返回绝对文件路径。

另请参阅 QAbstractItemModel,QLineEdit,QComboBoxCompletter Example

成员类型文档

enum QCompleter::CompletionMode

该枚举指定了向用户提供补全的方式。

常量说明
QCompleter::PopupCompletion0当前填写内容显示在弹出窗口中。
QCompleter::InlineCompletion2补全以内联方式显示(作为选定文本)。
QCompleter::UnfilteredPopupCompletion1所有可能的补全都会显示在弹出窗口中,最有可能的建议显示为当前建议。

另请参阅 setCompletionMode()。

enum QCompleter::ModelSorting

该枚举用于指定模型中项目的排序方式。

常数说明
QCompleter::UnsortedModel0模型未排序。
QCompleter::CaseSensitivelySortedModel1模型按大小写排序。
QCompleter::CaseInsensitivelySortedModel2模型不区分大小写排序。

另请参见 setModelSorting()。

属性文档

caseSensitivity : Qt::CaseSensitivity

该属性表示匹配的大小写敏感性。

默认值为Qt::CaseSensitive

访问功能:

Qt::CaseSensitivity caseSensitivity() const
void setCaseSensitivity(Qt::CaseSensitivity caseSensitivity)

另请参阅 completionColumn,completionRole,modelSortingfilterMode

completionColumn : int

该属性用于保存在模型中搜索补全的列。

如果popup() 是QListView ,则会自动设置为显示此列。

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

访问功能:

int completionColumn() const
void setCompletionColumn(int column)

另请参阅 completionRolecaseSensitivity

completionMode : CompletionMode

向用户提供补全的方式

默认值为QCompleter::PopupCompletion

访问功能:

QCompleter::CompletionMode completionMode() const
void setCompletionMode(QCompleter::CompletionMode mode)

completionPrefix : QString

该属性包含用于提供补全的完成前缀。

completionModel() 会被更新,以反映prefix 的可能匹配列表。

访问功能:

QString completionPrefix() const
void setCompletionPrefix(const QString &prefix)

completionRole : int

此属性包含用于查询项目内容以进行匹配的项目角色。

默认角色为Qt::EditRole

访问功能:

int completionRole() const
void setCompletionRole(int role)

另请参阅 completionColumncaseSensitivity

filterMode : Qt::MatchFlags

该属性控制过滤的执行方式。

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

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

默认模式为Qt::MatchStartsWith

访问功能:

Qt::MatchFlags filterMode() const
void setFilterMode(Qt::MatchFlags filterMode)

另请参阅 caseSensitivity

maxVisibleItems : int

该属性用于保存屏幕上允许的最大完成器尺寸,单位为项。

默认情况下,该属性的值为 7。

访问功能:

int maxVisibleItems() const
void setMaxVisibleItems(int maxItems)

modelSorting : ModelSorting

该属性决定了模型的排序方式

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

如果completionColumn() 和completionRole() 的模型数据是按升序排序的,则可以将此属性设置为CaseSensitivelySortedModelCaseInsensitivelySortedModel 。在大型模型中,这可以显著提高性能,因为补全器对象可以使用二进制搜索算法而不是线性搜索算法。

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

注意:如果完成器的caseSensitivity 与模型排序时使用的大小写敏感性不同,则无法实现上述性能改进。

访问功能:

QCompleter::ModelSorting modelSorting() const
void setModelSorting(QCompleter::ModelSorting sorting)

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

wrapAround : bool

该属性用于设置项目导航时的完成度环绕。

默认为 true。

访问函数:

bool wrapAround() const
void setWrapAround(bool wrap)

成员函数文档

QCompleter::QCompleter(QObject *parent = nullptr)

用给定的parent 构建一个完成器对象。

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

使用给定的parent 构建一个补全器对象,该对象提供来自指定model 的补全。

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

用给定的parent 构建一个 QCompleter 对象,该对象使用指定的list 作为可能的补全源。

[override virtual noexcept] QCompleter::~QCompleter()

销毁完成程序对象。

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

当用户激活popup() 中的项目时,将发送该信号。(点击或按回车键)。该项目在completionModel() 中的index 已给出。

注:在该类中,信号activated被重载。要使用函数指针语法连接该信号,Qt 提供了一个方便的辅助工具来获取函数指针,如本例所示:

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

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

popup() 中的某个项目被用户激活(通过点击或按回车键)时,就会发送该信号。项目的text 已给出。

注:该类重载了信号activated。要使用函数指针语法连接到此信号,Qt 提供了一个方便的辅助工具来获取函数指针,如本例所示:

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

[slot] 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() 中当前完成的模型索引。

另请参阅 setCurrentRow()、currentCompletion() 和model()。

int QCompleter::currentRow() const

返回当前行。

另请参阅 setCurrentRow()。

[override virtual protected] bool QCompleter::event(QEvent *ev)

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

[override virtual protected] bool QCompleter::eventFilter(QObject *o, QEvent *e)

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

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

popup() 中的某个项目被用户高亮显示时,就会发送该信号。如果调用complete() 时completionMode() 设为QCompleter::InlineCompletion ,也会发送该信号。completionModel() 中的项目index 已给出。

注:该类重载了高亮显示信号。要使用函数指针语法连接到该信号,Qt 提供了一个方便的辅助工具来获取函数指针,如本例所示:

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

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

popup() 中的某个项目被用户高亮显示时,就会发送该信号。如果调用complete() 时将completionMode() 设为QCompleter::InlineCompletion ,也会发送此信号。项目的text 已给出。

注:该类重载了高亮显示信号。要使用函数指针语法连接该信号,Qt 提供了一个方便的辅助工具来获取函数指针,如本例所示:

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

QAbstractItemModel *QCompleter::model() const

返回提供完成字符串的模型。

另请参阅 setModel() 和completionModel()。

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

返回给定index 的路径。完成器对象以此从底层模型中获取完成文本。

对于列表模型,默认实现返回项目的edit role 。如果模型是QFileSystemModel ,则返回绝对文件路径。

另请参阅 splitPath() 。

返回用于显示完成度的弹出窗口。

另请参见 setPopup()。

bool QCompleter::setCurrentRow(int row)

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

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

另请参阅 currentRow()、currentCompletion() 和completionCount()。

void QCompleter::setModel(QAbstractItemModel *model)

设置为model 提供补全的模型。model 可以是列表模型或树模型。如果之前已经设置了一个模型,且该模型的父模型是QCompleter ,则该模型将被删除。

为方便起见,如果modelQFileSystemModelQCompleter 会将其caseSensitivity 切换为Qt::CaseInsensitive (在 Windows 平台上)和Qt::CaseSensitive (在其他平台上)。

另请参阅 completionModel(),modelSorting, 和Handling Tree Models

void QCompleter::setPopup(QAbstractItemView *popup)

将用于显示完成情况的弹出窗口设置为popupQCompleter 拥有该视图的所有权。

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

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

另请参阅 popup() 。

void QCompleter::setWidget(QWidget *widget)

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

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

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

将给定的path 拆分为字符串,用于匹配model() 中的每一级。

当源模型()是QFileSystemModel 时,splitPath() 的默认实现会根据QDir::separator() 分割文件系统路径。

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

另请参阅 pathFromIndex() 和Handling Tree Models

QWidget *QCompleter::widget() const

返回补全器对象正在为其提供补全的 widget。

另请参见 setWidget()。

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.