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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QComboBox и автозавершение при вводе  (Прочитано 9443 раз)
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.033 секунд. Запросов: 20.