Поиск:

Ответ в темуСоздание новой темы Создание опроса
> QСomboBox и QCompleter 
V
    Опции темы
dix75
Дата 4.5.2012, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 462
Регистрация: 17.7.2007

Репутация: 1
Всего: 1



Добрый день!

Есть код.

Код

   QComboBox* edit = new QComboBox();

    QStringList* list = new QStringList();

    *list   << "Germany"  << "Russia"  << "United States"   << "United Kingdom";
    QCompleter* completer = new QCompleter(*list);
    edit->setCompleter(completer);

    edit->setEditable(true);
    edit->setAutoCompletion(true);
    edit->show();

Но ComboBox ничего не отображает, куда копать?

Причем если заменить QComboBox на QLineEdit все нормально работает.


Это сообщение отредактировал(а) dix75 - 4.5.2012, 00:53


--------------------
save your mind
PM MAIL   Вверх
dmitrio
Дата 4.5.2012, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 9.4.2009

Репутация: нет
Всего: нет



я в stringlist через append добавлял, все нормально отображает

P.S Хм, проверил у себя, все ок
P.SS Да, кстати, у меня он тоже ничего не отображает, отобразит только в том случае, если ввести первую букву, совпадающую с первыми буквами из QStringList тогда он отобразит эти значения

Это сообщение отредактировал(а) dmitrio - 4.5.2012, 10:10
PM MAIL   Вверх
math64
Дата 4.5.2012, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



setEditable(true); нужно переставить перед setCompleter(completer).
У нередактируемого комбо-бокса комплитеров нет.
PM   Вверх
_GRIN_
Дата 4.5.2012, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: 6
Всего: 7



Вообщем я попробывал в коде своего ItemDelegate (который QComboBox создаёт в createEditor() ) - со стринглистом и комплитором ничего не вышло, поп-ап не отображает все варианты - максимиму - срабатывает AutoCompletion - когда введённый текст с одним из вариантов совпадает.
Причём в делегате, который QLineEdit создаёт - всё ок - QStringList (член самого делегата) отрабатывает на ура.

Твой код у мена нормально заработал через модель.
Код

    QComboBox* edit = new QComboBox(parent);

    static QStandardItemModel model;
    if(model.rowCount() == 0)
    {
        model.appendRow(new QStandardItem("Germany"));
        model.appendRow(new QStandardItem("Russia"));
        model.appendRow(new QStandardItem("United States"));
        model.appendRow(new QStandardItem("United Kingdom"));
    }
    edit->setModel(&model);

    edit->setEditable(true);
    edit->setAutoCompletion(true);



Возможно то что QComboBox через QStringList не работает - баг троллей - но копать лень.


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
math64
Дата 4.5.2012, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Возможно, нужно после setEditable(true); нужно получить сам редактор с помощью lineEdit() и назначить комплетер непосредственно ему.

Это сообщение отредактировал(а) math64 - 4.5.2012, 16:21
PM   Вверх
dix75
Дата 4.5.2012, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 462
Регистрация: 17.7.2007

Репутация: 1
Всего: 1



Цитата(_GRIN_ @  4.5.2012,  16:00 Найти цитируемый пост)
поп-ап не отображает все варианты - максимиму - срабатывает AutoCompletion - когда введённый текст с одним из вариантов совпадает.

Да на такое поведение я и рачсчитывал


--------------------
save your mind
PM MAIL   Вверх
_GRIN_
Дата 4.5.2012, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: 6
Всего: 7



Вообщем суть в следующем (исходники 4.7.4):

1. QComboBox::completer() возвращает completer() своего lineEdit - который создаётся/уничтожается при вызове QComboBox::setEditable(bool).

Код

QCompleter *QComboBox::completer() const
{
    Q_D(const QComboBox);
    return d->lineEdit ? d->lineEdit->completer() : 0;
}


2. Поп-ап окошко содержит в себе данные модели комбобокса, а не модели комплитера.
Код

void QComboBox::showPopup()
{
    Q_D(QComboBox);
    if (count() <= 0)
        return;

    // много другого кода
}


Код

int QComboBox::count() const
{
    Q_D(const QComboBox);
    return d->model->rowCount(d->root);
}


Вот поэтому комплитер работал, а попап не отображался, а при работе через модель всё ок. Причем при создании lineEdit-а (через setEditable(true) ) комплитер правильно привязывается к модели комбобокса. Поэтому через модель пофиг когда и сколько раз ты setEdiable вызовешь.

P.S. Ещё раз убеждаюсь в том, что даже малелочи надо делать тщательно - через model + view =)

Добавлено через 3 минуты и 15 секунд
Цитата(dix75 @  4.5.2012,  20:16 Найти цитируемый пост)
Да на такое поведение я и рачсчитывал 

не очень дружелюбно к пользователям, которые любят мышку и не любят стучать по клаве - кликнул кнопку а там фига - спрашивает - нафига комбобокс, когда можно просто QLineEdit с комплитером засунуть и не путать пользователей?


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
dix75
Дата 4.5.2012, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 462
Регистрация: 17.7.2007

Репутация: 1
Всего: 1



Цитата(_GRIN_ @  4.5.2012,  16:00 Найти цитируемый пост)
    QComboBox* edit = new QComboBox(parent);    static QStandardItemModel model;    if(model.rowCount() == 0)    {        model.appendRow(new QStandardItem("Germany"));        model.appendRow(new QStandardItem("Russia"));        model.appendRow(new QStandardItem("United States"));        model.appendRow(new QStandardItem("United Kingdom"));    }    edit->setModel(&model);    edit->setEditable(true);    edit->setAutoCompletion(true);


Да у меня тоже, спасибо.

Добавлено через 2 минуты и 5 секунд
Цитата(_GRIN_ @  4.5.2012,  22:28 Найти цитируемый пост)
не очень дружелюбно к пользователям, которые любят мышку и не любят стучать по клаве - кликнул кнопку а там фига - спрашивает - нафига комбобокс, когда можно просто QLineEdit с комплитером засунуть и не путать пользователей?

Вот вот.


--------------------
save your mind
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0468 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.