IT Notes

QCompleter: Базовое авто-дополнение в Qt

Авто-дополнение текста в Qt проще всего реализовать с помощью специально разработанного для этой цели стандартного компонента QCompleter. Разработаем приложение, демонстрирующее базовые принципы работы с ним.

Начнем с компоновки формы в Qt Designer:

qcompleter-demo-form-thumbnail

В верхней части виджета располагается QLineEdit и QPushButton. Снизу разместился QListWidget. Авто-дополнение мы установим для поля ввода QLineEdit на основе слов из списка QListWidget.

Если после начала ввода текста в QLineEdit обнаруживается совпадение с одним или несколькими словами из QListWidget, то QCompleter предлагает варианты завершения в выпадающем списке (аналогично выпадающему списку QComboBox).

Список слов можно пополнять путем нажатия кнопки Добавить. При этом мы обеспечим добавление лишь уникальных вариантов дополнения (дубликаты нам не нужны).

Выглядит это следующим образом:

qcompleter-sample-app

Реализация

Заголовочный файл completerdemowidget.h:

#ifndef COMPLETERDEMOWIDGET_H
#define COMPLETERDEMOWIDGET_H

#include <QWidget>

namespace Ui {
class CompleterDemoWidget;
}

class CompleterDemoWidget : public QWidget {
    Q_OBJECT

public:
    explicit CompleterDemoWidget( QWidget* parent = 0 );
    ~CompleterDemoWidget();

private slots:
    void onAddWord();

private:
    Ui::CompleterDemoWidget* ui;
};

#endif // COMPLETERDEMOWIDGET_H

А теперь completerdemowidget.cpp:

#include "completerdemowidget.h"
#include "ui_completerdemowidget.h"

#include <QCompleter>

CompleterDemoWidget::CompleterDemoWidget( QWidget* parent ) :
    QWidget( parent ),
    ui( new Ui::CompleterDemoWidget ) {
    ui->setupUi( this );

    connect( ui->bnAdd, SIGNAL( clicked( bool ) ), SLOT( onAddWord() ) );

    QCompleter* completer = new QCompleter( this );
    completer->setModel( ui->listWidget->model() );
    completer->setCaseSensitivity( Qt::CaseInsensitive );
    ui->lnEdit->setCompleter( completer );
}

CompleterDemoWidget::~CompleterDemoWidget() {
    delete ui;
}

void CompleterDemoWidget::onAddWord() {
    const QString text = ui->lnEdit->text().trimmed();
    if( text.isEmpty() ) {
        return;
    }
    if( !ui->listWidget->findItems( text, Qt::MatchFixedString ).isEmpty() ) {
        return;
    }

    ui->listWidget->addItem( text );
    ui->lnEdit->clear();
}

Особый интерес представляет фрагмент инициализации QCompleter-а:

QCompleter* completer = new QCompleter( this );
completer->setModel( ui->listWidget->model() );
completer->setCaseSensitivity( Qt::CaseInsensitive );
ui->lnEdit->setCompleter( completer );

Авто-дополнение может осуществляться либо на основе списка строк QStringList, либо на основе Модели. Мы воспользовались вторым вариантом, указав, что наш completer должен использовать модель списка ui->listWidget->model(). В общем случае подход на основе Модели является более универсальным. Например, Модель можно привязать к базе данных и помогать пользователям вводить адреса или какие-либо названия.

Поиск совпадений для авто-дополнения может регулироваться на основе учета регистра символов. Мы в примере устанавливаем опцию поиска без учета регистра Qt::CaseInsensitive.

Исходники

 Скачать пример использования QCompleter

Похожие публикации

Комментарии

Добрый день можете в следующей статье рассказать про реализацию алгоритма шифрования CAST-128 .

Здравствуйте. Хорошо, займусь

Здравствуйте когда будет новая статья ?

Здравствуйте. Материал уже готов. Осталось только оформить. Думаю, что в ближайшие дни выйдет.