1、有何用处
QCompleter类提供基于项模型的补全功能。您可以使用QCompleter在任何Qt小部件(如QLineEdit和QComboBox)中提供自动补全。当用户开始键入单词时,QCompleter会根据单词列表建议完成单词的可能方式。单词列表作为QAbstractItemModel提供。(对于单词列表是静态的简单应用程序,可以将QStringList传递给QCompleter的构造函数。)
2、示例代码
#include "widget.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QLabel>
#include <QLineEdit>
#include <QCompleter>
#include <QDirModel>
#include <QStringListModel>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
setFixedSize({400,200});
QVBoxLayout* layout = new QVBoxLayout(this);
QHBoxLayout* layout1 = new QHBoxLayout();
QLabel* label1 = new QLabel("city:");
m_lineEdit1 = new QLineEdit(this);
layout1->addWidget(label1);
layout1->addWidget(m_lineEdit1);
QHBoxLayout* layout2 = new QHBoxLayout();
QLabel* label2 = new QLabel("dirs:");
QLineEdit *lineEdit2 = new QLineEdit(this);
layout2->addWidget(label2);
layout2->addWidget(lineEdit2);
layout->addStretch(1);
layout->addLayout(layout1);
layout->addLayout(layout2);
layout->addStretch(1);
m_wordModel = new QStringListModel(this);
m_wordList << "beijing" << "shanghai" << "guangzhou" << "shenzhen";
m_wordModel->setStringList(m_wordList);
QCompleter *completer = new QCompleter(m_wordModel, this);
completer->setCaseSensitivity(Qt::CaseInsensitive);
completer->setCompletionMode(QCompleter::PopupCompletion);
m_lineEdit1->setCompleter(completer);
QCompleter *completer2 = new QCompleter(this);
completer2->setMaxVisibleItems(7);
completer2->setCaseSensitivity(Qt::CaseInsensitive);
completer2->setModel(new QDirModel(completer2));
lineEdit2->setCompleter(completer2);
for(int i = 0; completer->setCurrentRow(i); i++)
{
qDebug() << completer->currentCompletion() << " is match number " << i;
}
connect(completer, static_cast<void(QCompleter::*)(const QString &)>(&QCompleter::activated), [](const QString& text) {
qDebug() << "activated:" << text;
});
connect(completer, QOverload<const QString &>::of(&QCompleter::highlighted), [](const QString& text){
qDebug() << "highlighted:" << text;
});
connect(m_lineEdit1, &QLineEdit::editingFinished, [&](){
QString text = m_lineEdit1->text();
if(!text.isEmpty())
{
if(!m_wordList.contains(text, Qt::CaseInsensitive))
{
m_wordList.append(text);
m_wordModel->setStringList(m_wordList);
}
}
});
}
Widget::~Widget()
{
}
3、效果图
- 使用QStringList作为Model的一般场景
- 当输入字符不存在,敲击回车键,将新键入的单词存入Model,下次输入时可以自动联想
4、其他可能场景
void QCompleter::setModel(QAbstractItemModel *model)
QCompleter 通过设置模型提供补全的模型(模型可以是列表模型或树模型)便可以为其他场景的实现提供更多可能。比如本文中未进行录屏演示的文件模型:在输入盘符后,便可以快速找到磁盘下其他文件路径,对于有这方面需求的用户来说,这种设计真的很友好!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)