Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > QСomboBox и QCompleter


Автор: dix75 4.5.2012, 00:52
Добрый день!

Есть код.

Код

   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 все нормально работает.

Автор: dmitrio 4.5.2012, 09:58
я в stringlist через append добавлял, все нормально отображает

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

Автор: math64 4.5.2012, 10:45
setEditable(true); нужно переставить перед setCompleter(completer).
У нередактируемого комбо-бокса комплитеров нет.

Автор: _GRIN_ 4.5.2012, 16:00
Вообщем я попробывал в коде своего 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 не работает - баг троллей - но копать лень.

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

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

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

Автор: _GRIN_ 4.5.2012, 22:28
Вообщем суть в следующем (исходники 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 с комплитером засунуть и не путать пользователей?

Автор: dix75 4.5.2012, 22:44
Цитата(_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 с комплитером засунуть и не путать пользователей?

Вот вот.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)