Russian Qt Forum
Сентябрь 30, 2024, 08:22 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QComboBox и автозавершение при вводе  (Прочитано 9142 раз)
Boris
Гость
« : Февраль 22, 2008, 11:01 »

Есть QComboBox
Код:
        QComboBox *cb = new QComboBox(this);
cb->setInsertPolicy(QComboBox::NoInsert);
cb->setEditable(true);
cb->addItem("Проба_1");
cb->addItem("Проба_2");

Как в нем можно управлять автозавершением? Оно есть, но мне нужно чтобы пользователь мог вести только значения из списка комбобокса т.е. ничего кроме Проба_1 или Проба_2.
Но ввод нужен, т.е. cb->setEditable(false) не подходит
Записан
WW
Гость
« Ответ #1 : Февраль 22, 2008, 12:43 »

QCompleter * QComboBox::completer () const
Returns the completer that is used to auto complete text input for the combobox.
This function was introduced in Qt 4.2.
See also setCompleter() and editable.
Записан
Boris
Гость
« Ответ #2 : Февраль 22, 2008, 13:30 »

Про completer () я тоже прочел - как им пользоваться?

Я нашел
Код:
        QStringList strlist;
        strlist.append("Проба_1");
strlist.append("Проба_2");
QCompleter * completer = new QCompleter(strlist, cb);
cb->setCompleter(completer);
cb->setAutoCompletion(true);
//cb->setEditable(false);
completer->setCompletionMode(QCompleter::InlineCompletion);

Но произвольные значения как можно было вводить, так ничего не поменялось. Мне нужно было чтобы ничего кроме Проба_1 Проба_2 ввести нельзя было
« Последнее редактирование: Февраль 22, 2008, 13:40 от Boris » Записан
Вячеслав
Гость
« Ответ #3 : Февраль 22, 2008, 14:38 »

В сторону QValidator'а посмотри...
Либо лови void editTextChanged ( const QString & text )  и руками разруливай Подмигивающий
Записан
Boris
Гость
« Ответ #4 : Февраль 22, 2008, 15:03 »

Там в комбобоксе строчки (именно текст). как в такм случае использовать Validator?
Записан
Вячеслав
Гость
« Ответ #5 : Февраль 22, 2008, 20:32 »

Делаешь наследника и в validate проверяешь строка в списке или нет Ы ?
Записан
Boris
Гость
« Ответ #6 : Февраль 23, 2008, 12:18 »

Спасибо Вячеслав действительно вышло, хоть и верилось с трудом.
Если кто то мучает тот же вопрос - вот
ComboValidator.h
Код:
#ifndef COMBOVALIDATOR_H_
#define COMBOVALIDATOR_H_

#include <QtGui/QWidget>
#include <QValidator>
#include <QComboBox>

class ComboValidator : public QValidator
{
public:
ComboValidator(QWidget* parent=0);
QValidator::State validate(QString&, int&) const;
//QStringList strList;
virtual ~ComboValidator();
};

#endif /*COMBOVALIDATOR_H_*/
ComboValidator.cpp
Код:
#include "ComboValidator.h"

ComboValidator::ComboValidator(QWidget* parent)
  : QValidator(parent)
{
}


QValidator::State ComboValidator::validate(QString& text, int&) const
{
  QString srch = text/*.toUpper()*/;
  if(srch.isEmpty())
  return Acceptable;
  QComboBox *cb = (QComboBox*)(this->parent());
  for(int i=0; i<cb->count(); i++)
  {
if(/*cb->itemText(i).contains(srch, Qt::CaseInsensitive)*/cb->itemText(i).indexOf(srch, 0, Qt::CaseInsensitive) == 0)
{
return Acceptable;
}
  }
  return Invalid;
}

ComboValidator::~ComboValidator()
{
}
Использовать лутше в режиме QCompleter::InlineCompletion
« Последнее редактирование: Февраль 23, 2008, 13:53 от Boris » Записан
Amouse
Гость
« Ответ #7 : Март 06, 2008, 13:42 »

А что в QCompleter нет возможности менять список?
Каждый раз когда список меняется, получается надо делать новый completer (new) и подключать к QComboBox?
Записан
Вячеслав
Гость
« Ответ #8 : Март 06, 2008, 14:07 »

Ну таки сделай модель и меняй скока хош Подмигивающий
Записан
Amouse
Гость
« Ответ #9 : Март 06, 2008, 17:25 »

Ну таки сделай модель и меняй скока хош Подмигивающий

э-э-э.. а можно чуть поподробнее?
Взять скажем QListWidget и туда засовывать список файлов (в QComboBox у меня адресная строка)?
И его в QCompleter ( QAbstractItemModel * model, QObject * parent = 0 ) ?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.126 секунд. Запросов: 20.