QT之QCompleter的用法--- 最简单的使用方法
本文讲解最简单的使用方法:
QCompleter能实现自动填充功能,方便用户输入,提升用户的体验,一般和QLineEdit与QComboBox搭配起来使用.
先来个最简单的示例:
QStringList word_list;
word_list<<"XiaoTu"<<"xiaomi"<<"Huawei"<<"huafei"<<"Shanghai"<<"shangshan"<<"abc";
QCompleter *completer = new QCompleter(word_list, this);
ui->lineEdit_Simple->setCompleter(completer);
运行起来,效果如下:
默认构造的QCompleter采用QStringListModel(最简单的Model,就是一个字符串列表),相关的属性如下:
completer->maxVisibleItems() = 7 //弹出的列表框的最大项是7,多了就出滚动条
completer->caseSensitivity() = CaseSensitive //搜索的时候,大小写敏感
当用户需要输入一个路径时,可以使用QDirModel,使用起来也非常简单惬意
QCompleter *completer = new QCompleter();
QDirModel *dirModel = new QDirModel();
completer->setModel(dirModel);
ui->lineEdit_FilePath->setCompleter(completer);
运行后效果如下:
相关的属性如下:
completer->maxVisibleItems() = 7 //弹出的列表框的最大项是7,多了就出滚动条
completer->caseSensitivity() = CaseInsensitive //搜索的时候,忽略大小写,因为是我是在WIN下运行的,在类UNIX系统,这个应该是大小写敏感的
现在来测试自动增加候选项
类似于搜索框,当你什么都没有搜索时,搜索的提示为空,当你输入一个内容,并敲回车,就会记录你这个候选项.
看图,我输入了abc回车 adcd回车
使用的代码如下:
void MainWindow::initAutoAdd()
{
m_completer_autoadd = new QCompleter(this);
m_string_list_mode_autoadd = new QStringListModel(this);
m_completer_autoadd->setModel(m_string_list_mode_autoadd);
m_string_list_mode_autoadd->setStringList(m_word_list_autoadd);
ui->lineEdit_AutoAdd->setCompleter(m_completer_autoadd);
}
void MainWindow::on_lineEdit_AutoAdd_editingFinished()
{
QString text = ui->lineEdit_AutoAdd->text();
if(!text.isEmpty())
{
if(!m_word_list_autoadd.contains(text, Qt::CaseSensitive))
{
m_word_list_autoadd << text;
//虽然初始化已经设置了setStringList,但这里也要再次设置,否则没效果
m_string_list_mode_autoadd->setStringList(m_word_list_autoadd);
}
}
}
最后,测试一个比较大的QStringList
从一个文件里读出所有的ITEM,这个文件有9万多行
文件可以从linux的/usr/share/dict/words中找到.
初始化代码如下:
QFile file(":/res/words");
file.open(QIODevice::ReadOnly|QIODevice::Text);
QTextStream in(&file);
QString s = in.readAll();
QStringList list = s.split('\n');
m_completer_test = new QCompleter(list, this);
ui->lineEdit->setCompleter(m_completer_test);
ui->comboBox->addItems(list);
ui->comboBox->setCompleter(m_completer_test);
1).大小写敏感设置,如图:
相关代码:
Qt::CaseSensitivity c = m_completer_test->caseSensitivity();
if(Qt::CaseSensitive == c)
{
ui->checkBox->setChecked(true);
}
void MainWindow::on_checkBox_stateChanged(int arg1)
{
if (Qt::Checked == arg1) {
m_completer_test->setCaseSensitivity(Qt::CaseSensitive);
}else
{
m_completer_test->setCaseSensitivity(Qt::CaseInsensitive);
}
}
2).CompletionMode,一共有如下几个值:
enum CompletionMode {
PopupCompletion, //弹出列表,但只会出现匹配的ITEM
UnfilteredPopupCompletion, //弹出列表,匹配的放前面,不匹配的放后面,全部ITEM都会呈现,当ITEM个数很多时,很卡,看下图
InlineCompletion//不弹出列表,直接在用户输入框里提示
};
相关代码:
//初始化
QCompleter::CompletionMode cm = m_completer_test->completionMode();
ui->comboBox_CompletionMode->setCurrentIndex((int)cm);
void MainWindow::on_comboBox_CompletionMode_currentIndexChanged(int index)
{
m_completer_test->setCompletionMode((QCompleter::CompletionMode)index);
}
3).maxVisibleItems,这个比较简单,就是弹出的框的高度(最多显示多少行)
相关代码:
ui->spinBox->setValue(m_completer_test->maxVisibleItems());
void MainWindow::on_spinBox_valueChanged(int arg1)
{
m_completer_test->setMaxVisibleItems(arg1);
}
4).maxVisibleItems,这个比较简单,就是弹出的框的高度(最多显示多少行)
QCompleter的两个信号
void activated ( const QString & text )
void highlighted ( const QString & text )
其含义不言自明, 请看下图,注意观察StatusBar
相关代码:
QObject::connect(m_completer_test,SIGNAL(activated ( const QString &)), this, SLOT(onCompleterActivated(const QString&)));
QObject::connect(m_completer_test,SIGNAL(highlighted ( const QString &)), this, SLOT(onCompleterHighlighted(const QString&)));
void MainWindow::onCompleterActivated(const QString &text)
{
ui->statusBar->showMessage(QString("Activated:") + text);
}
void MainWindow::onCompleterHighlighted(const QString &text)
{
ui->statusBar->showMessage(QString("Highlighted:") + text);
}
本文没讲解的内容,会相对来说复杂些, 下次讲
目前直接用默认值就好了,比如modelSorting
完整代码见 http://q1024.com/files/900100.7z
参考:
http://blog.sina.com.cn/s/blog_a6fb6cc90101gu7w.html
https://www.ics.com/blog/qcomple ... -more-user-friendly
本文来自博客园,作者:xingzaicpp,转载请注明原文链接:https://www.cnblogs.com/xingzaicpp/p/16664992.html