QCompleter 类
QCompleter 类根据项目模型提供补全功能。 更多...
头文件 | #include <QCompleter> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Widgets) target_link_libraries(mytarget PRIVATE Qt6::Widgets) |
qmake | QT += 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::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 QString &text) |
void | activated(const QModelIndex &index) |
void | highlighted(const QString &text) |
void | highlighted(const QModelIndex &index) |
重写的受保护函数
virtual bool | event(QEvent *ev) override |
virtual bool | eventFilter(QObject *o, QEvent *e) override |
详细信息
您可以使用 QCompleter 为任何 Qt 小部件提供自动完成功能,例如 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 时工作。
该模型可以是列表模型、表格模型或树模型。在树模型上的完成操作较为复杂,下面在处理树模型部分进行介绍。
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的模式返回绝对文件路径。
另请参阅 QAbstractItemModel、QLineEdit、QComboBox 和 Completer Example。
成员类型文档
枚举 QCompleter::CompletionMode
此枚举指定如何向用户提供补全。
常量 | 值 | 描述 |
---|---|---|
QCompleter::PopupCompletion | 0 | 当前补全显示在弹出窗口中。 |
QCompleter::InlineCompletion | 2 | 补全以行内形式(作为所选文本)出现。 |
QCompleter::UnfilteredPopupCompletion | 1 | 所有可能的补全都显示在包含最大可能性建议项的弹出窗口中。 |
另请参阅setCompletionMode。
枚举 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() 更新以反映前缀的可能匹配项列表。
访问函数
QString | completionPrefix() const |
void | setCompletionPrefix(const QString &prefix) |
completionRole : int
此属性保留用于查询项目内容的匹配项的角色。
默认角色是 Qt::EditRole。
访问函数
int | completionRole() const |
void | setCompletionRole(introle) |
另请参阅 completionColumn 和 caseSensitivity。
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()数据按升序排序,可以将此属性设置为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构造一个补全过程对象。
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 子类的实例。
另请参阅:completionPrefix 和 model。
QString QCompleter::currentCompletion() const
返回当前补全字符串。这包括completionPrefix。当与setCurrentRow()一起使用时,可以用来遍历所有匹配项。
另请参阅setCurrentRow() 和 currentIndex。
QModelIndex QCompleter::currentIndex() const
返回completionModel中当前补全的模型索引。
另请参阅setCurrentRow、currentCompletion 和 model。
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::InlineCompletion的complete()调用,也会发送此信号。给出项的text。
注意:此类中信号highlighted被重载。如果要使用函数指针语法连接到此信号,Qt提供了方便的辅助函数,如下例所示。
connect(completer, QOverload<const QString &>::of(&QCompleter::highlighted), [=](const QString &text){ /* ... */ });
[信号]
void QCompleter::highlighted(const QModelIndex &index)
当用户突出显示popup()中的项时,将发送此信号。如果使用设置有completionMode()为QCompleter::InlineCompletion的complete()调用,也会发送此信号。给出项在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。
QAbstractItemView *QCompleter::popup() const
返回用于显示补全项的弹出窗口。
另请参阅setPopup。
bool QCompleter::setCurrentRow(int row)
将当前行设置为指定的 row。如果成功,返回 true
;否则返回 false
。
此函数可以与 currentCompletion() 一起使用来遍历所有可能的补全项。
另请参阅currentRow、currentCompletion 和 completionCount。
void QCompleter::setModel(QAbstractItemModel *model)
设置提供补全的模型为 model。该模型可以是列表模型或树模型。如果已设置了模型并且该模型将 QCompleter 作为其父项,则将其删除。
为了方便,如果 model 是 QFileSystemModel,则 QCompleter 在 Windows 上将 caseSensitivity 切换到 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。当在 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. 在芬兰以及全球其他国家的商标。所有其他商标均为其各自所有者的财产。