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

 

posted @ 2022-09-07 12:35  xingzaicpp  阅读(967)  评论(0编辑  收藏  举报