Авто-дополнение текста в Qt проще всего реализовать с помощью специально разработанного для этой цели стандартного компонента QCompleter
. Разработаем приложение, демонстрирующее базовые принципы работы с ним.
Начнем с компоновки формы в Qt Designer:
В верхней части виджета располагается QLineEdit
и QPushButton
. Снизу разместился QListWidget
. Авто-дополнение мы установим для поля ввода QLineEdit
на основе слов из списка QListWidget
.
Если после начала ввода текста в QLineEdit
обнаруживается совпадение с одним или несколькими словами из QListWidget
, то QCompleter
предлагает варианты завершения в выпадающем списке (аналогично выпадающему списку QComboBox
).
Список слов можно пополнять путем нажатия кнопки Добавить
. При этом мы обеспечим добавление лишь уникальных вариантов дополнения (дубликаты нам не нужны).
Выглядит это следующим образом:
Заголовочный файл 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
Здравствуйте. Хорошо, займусь
Здравствуйте когда будет новая статья ?
Здравствуйте. Материал уже готов. Осталось только оформить. Думаю, что в ближайшие дни выйдет.
Anonymous
Добрый день можете в следующей статье рассказать про реализацию алгоритма шифрования CAST-128 .