QCompleter Class
QCompleter 类基于项目模型提供补全功能。更多内容...
| 头文件: | #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 Widgets 中提供自动补全功能,例如QLineEdit 和QComboBox 。当用户开始输入单词时,QCompleter 会根据词表建议可能的补全方式。 词汇表以QAbstractItemModel 的形式提供。(对于词汇表为静态的简单应用程序,您可以将QStringList 传递给QCompleter的构造函数。)
基本用法
QCompleter通常与QLineEdit 或QComboBox 配合使用。例如,以下代码演示了如何在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() 更改此行为。
如果模型已按用于自动补全的列和角色进行了排序,则可以调用setModelSorting(),并将QCompleter::CaseSensitivelySortedModel 或QCompleter::CaseInsensitivelySortedModel 作为参数。对于大型模型,这可以显著提升性能,因为QCompleter此时可以使用二分搜索代替线性搜索。二分搜索仅在filterMode 为Qt::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() 的默认实现会使用QDir::separator() 将completionPrefix 进行拆分,前提是模式为QFileSystemModel 。
为了提供代码补全功能,QCompleter 需要知道从索引开始的路径。该路径由pathFromIndex() 提供。pathFromIndex() 的默认实现,对于列表模型会返回edit role 的数据;若模式为QFileSystemModel ,则返回绝对文件路径。
另请参阅 QAbstractItemModel 、QLineEdit 、QComboBox 以及Completer 示例。
成员类型文档
enum QCompleter::CompletionMode
此枚举指定了向用户提供自动补全的方式。
| 常量 | 值 | 描述 |
|---|---|---|
QCompleter::PopupCompletion | 0 | 当前的补全结果将显示在弹出窗口中。 |
QCompleter::InlineCompletion | 2 | 补全项以内联方式显示(作为选中的文本)。 |
QCompleter::UnfilteredPopupCompletion | 1 | 所有可能的补全项都会显示在弹出窗口中,其中最可能的建议会被标记为“当前”选项。 |
另请参阅 ` setCompletionMode()`。
enum QCompleter::ModelSorting
此枚举指定模型中项的排序方式。
| 常量 | 值 | 描述 |
|---|---|---|
QCompleter::UnsortedModel | 0 | 模型未排序。 |
QCompleter::CaseSensitivelySortedModel | 1 | 模型按区分大小写的方式进行排序。 |
QCompleter::CaseInsensitivelySortedModel | 2 | 该模型按不区分大小写的方式排序。 |
另请参阅 setModelSorting()。
属性文档
caseSensitivity : Qt::CaseSensitivity
此属性控制匹配操作的区分大小写设置
默认值为Qt::CaseSensitive 。
访问函数:
| Qt::CaseSensitivity | caseSensitivity() const |
| void | setCaseSensitivity(Qt::CaseSensitivity caseSensitivity) |
另请参阅 completionColumn 、completionRole 、modelSorting 以及filterMode 。
completionColumn : int
该属性用于指定模型中用于搜索补全项的列。
如果“popup()”是一个“QListView ”,则会自动配置为显示该列。
默认情况下,匹配列为 0。
访问函数:
| int | completionColumn() const |
| void | setCompletionColumn(int column) |
另请参阅 completionRole 和caseSensitivity 。
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) |
另请参阅 completionColumn 和caseSensitivity 。
filterMode : Qt::MatchFlags
此属性控制过滤操作的执行方式。
如果将 filterMode 设置为Qt::MatchStartsWith ,则仅显示以输入字符开头的条目;Qt::MatchContains 将显示包含输入字符的条目;Qt::MatchEndsWith 则显示以输入字符结尾的条目。
将 filterMode 设置为除“Qt::MatchFlag ”以外的任何其他模式都会触发警告,且不会执行任何操作。因此,“Qt::MatchCaseSensitive ”标志无效。请使用caseSensitivity 属性来控制区分大小写。
默认模式为Qt::MatchStartsWith 。
Access 函数:
| Qt::MatchFlags | filterMode() const |
| void | setFilterMode(Qt::MatchFlags filterMode) |
另请参阅 caseSensitivity 。
maxVisibleItems : int
该属性指定补全器在屏幕上允许的最大显示大小,以项目为单位
默认情况下,该属性的值为 7。
访问函数:
| int | maxVisibleItems() const |
| void | setMaxVisibleItems(int maxItems) |
modelSorting : ModelSorting
该属性用于存储模型的排序方式
默认情况下,对于提供补全功能的模型中各项的顺序,系统不作任何假设。
如果模型中用于completionColumn()和completionRole()的数据按升序排序,您可以将此属性设置为CaseSensitivelySortedModel 或CaseInsensitivelySortedModel 。对于大型模型,这可能会显著提高性能,因为这样补全器对象就可以使用二进制搜索算法,而不是线性搜索算法。
模型的排序顺序(即升序或降序)是通过检查模型内容动态确定的。
注意:当补全器的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 构建一个completer对象。
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 。
注意:此 信号已被重载。要连接到此信号:
// Connect using qOverload:
connect(completer, qOverload(&QCompleter::activated),
receiver, &ReceiverClass::slot);
// Or using a lambda:
connect(completer, qOverload(&QCompleter::activated),
this, [](const QModelIndex &index) { /* handle activated */ }); [signal] void QCompleter::activated(const QString &text)
当用户激活popup()中的某个项目(通过点击或按下回车键)时,会发送此信号。会传入该项目的text 。
注意:此 信号已被重载。要连接此信号:
// Connect using qOverload:
connect(completer, qOverload(&QCompleter::activated),
receiver, &ReceiverClass::slot);
// Or using a lambda:
connect(completer, qOverload(&QCompleter::activated),
this, [](const QString &text) { /* handle activated */ }); [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 ` 子类的实例。
另请参阅 completionPrefix 和model()。
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 会被传入。
注意:此 信号已被重载。要连接到此信号:
// Connect using qOverload:
connect(completer, qOverload(&QCompleter::highlighted),
receiver, &ReceiverClass::slot);
// Or using a lambda:
connect(completer, qOverload(&QCompleter::highlighted),
this, [](const QModelIndex &index) { /* handle highlighted */ }); [signal] void QCompleter::highlighted(const QString &text)
当用户选中popup()中的某个项目时,会发送此信号。此外,如果在调用complete()时将completionMode()设置为QCompleter::InlineCompletion ,也会发送此信号。会提供该项目的text 。
注意:此 信号已被重载。要连接到此信号:
// Connect using qOverload:
connect(completer, qOverload(&QCompleter::highlighted),
receiver, &ReceiverClass::slot);
// Or using a lambda:
connect(completer, qOverload(&QCompleter::highlighted),
this, [](const QString &text) { /* handle highlighted */ }); QAbstractItemModel *QCompleter::model() const
返回提供补全字符串的模型。
另请参阅 setModel() 和completionModel()。
[virtual] QString QCompleter::pathFromIndex(const QModelIndex &index) const
返回给定index 的路径。补全器对象使用该路径从底层模型中获取补全文本。
对于列表模型,默认实现会返回该项的edit role 。如果模型是QFileSystemModel ,则返回绝对文件路径。
另请参阅 splitPath()。
QAbstractItemView *QCompleter::popup() const
返回用于显示补全结果的弹出窗口。
另请参阅 setPopup()。
bool QCompleter::setCurrentRow(int row)
将当前行设置为指定的row 。若操作成功,则返回true ;否则返回false 。
该函数可与currentCompletion()配合使用,以遍历所有可能的补全项。
另请参阅 currentRow()、currentCompletion() 和completionCount()。
void QCompleter::setModel(QAbstractItemModel *model)
设置为model 提供补全功能的模型。model 可以是列表模型或树模型。如果之前已设置过模型,且其父节点为QCompleter ,则该模型将被删除。
为方便起见,如果model 是QFileSystemModel ,则当QCompleter 时,其caseSensitivity 在Windows上将切换为Qt::CaseInsensitive ,在其他平台上将切换为Qt::CaseSensitive 。
另请参阅 completionModel()、modelSorting 以及Handling Tree Models 。
void QCompleter::setPopup(QAbstractItemView *popup)
将用于显示补全结果的弹出窗口设置为popup 。QCompleter 将获取该视图的所有权。
当completionMode()被设置为QCompleter::PopupCompletion 或QCompleter::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()的各个层级进行匹配。
当 sourceModel() 为QFileSystemModel 时,splitPath() 的默认实现会根据QDir::separator() 对文件系统路径进行拆分。
当与列表模型一起使用时,将使用返回列表中的第一个项目进行匹配。
另请参阅 pathFromIndex() 和Handling Tree Models 。
QWidget *QCompleter::widget() const
返回该补全对象正在为其提供补全功能的小部件。
另请参阅 setWidget()。
© 2026 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.