Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Boris от Февраль 22, 2008, 11:01



Название: QComboBox и автозавершение при вводе
Отправлено: 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) не подходит


Название: Re: QComboBox и автозавершение при вводе
Отправлено: WW от Февраль 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.


Название: Re: QComboBox и автозавершение при вводе
Отправлено: Boris от Февраль 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 ввести нельзя было


Название: Re: QComboBox и автозавершение при вводе
Отправлено: Вячеслав от Февраль 22, 2008, 14:38
В сторону QValidator'а посмотри...
Либо лови void editTextChanged ( const QString & text )  и руками разруливай ;)


Название: Re: QComboBox и автозавершение при вводе
Отправлено: Boris от Февраль 22, 2008, 15:03
Там в комбобоксе строчки (именно текст). как в такм случае использовать Validator?


Название: Re: QComboBox и автозавершение при вводе
Отправлено: Вячеслав от Февраль 22, 2008, 20:32
Делаешь наследника и в validate проверяешь строка в списке или нет Ы ?


Название: Re: QComboBox и автозавершение при вводе
Отправлено: Boris от Февраль 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


Название: Re: QComboBox и автозавершение при вводе
Отправлено: Amouse от Март 06, 2008, 13:42
А что в QCompleter нет возможности менять список?
Каждый раз когда список меняется, получается надо делать новый completer (new) и подключать к QComboBox?


Название: Re: QComboBox и автозавершение при вводе
Отправлено: Вячеслав от Март 06, 2008, 14:07
Ну таки сделай модель и меняй скока хош ;)


Название: Re: QComboBox и автозавершение при вводе
Отправлено: Amouse от Март 06, 2008, 17:25
Ну таки сделай модель и меняй скока хош ;)

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