Qt: комбобокс с определёнными индексами

Модератор: Модераторы разделов

IMB
Сообщения: 2567
ОС: Debian

Qt: комбобокс с определёнными индексами

Сообщение IMB »

Доброго дня!
Необходимо заполнить QComboBox определёнными значениями, но индексы должны начинаться не с 0, а каждому значению необходимо присвоить свой индекс.
Написал так:

Код: Выделить всё

ui->wdr_mode->insertItem(1, tr("1 point"), QVariant(1));
ui->wdr_mode->insertItem(2, tr("2 point"), QVariant(2));
ui->wdr_mode->insertItem(3, tr("3 point"), QVariant(3));

Но это не работает, похоже, что индексация началась с нуля.
Вопрос - как правильно заполнять QComboBox значениями с определёнными индексами?
Спасибо.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Qt: комбобокс с определёнными индексами

Сообщение NickLion »

Индексы всё равно будут с 0 и по порядку. Для того, чтобы связать с пунктом какое-то значение придумали userData. insertItem() можете спокойно заменить на addItem(). А вот то самое QVariant Вам и нужно, то что тут указано добавляется с ролью Qt::UserRole. Получить userData по индексу: itemData(), по данным узнать индекс: findData().
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Qt: комбобокс с определёнными индексами

Сообщение IMB »

Хм, не затруднит привести пример кода, а то как-то из документации не совсем понял механизм?
Мне необходимо внести в QComboBox три пукта - point1 с индеком 1, point2 с индексом 2 и point3 с индексом 3. Больше ничего в QComboBox отображаться не должно.
Индекс должен участвовать в дальнейших действиях, как-то изменение интерфейса:

Код: Выделить всё

switch (index) {
    case 1:
        ui->wdr_point2->setEnabled(false);
        ui->wdr_point3->setEnabled(false);
        break;
    case 2:
        ui->wdr_point2->setEnabled(true);
        ui->wdr_point3->setEnabled(false);
        break;
    case 3:
        ui->wdr_point2->setEnabled(true);
        ui->wdr_point3->setEnabled(true);
        break;
    }
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Qt: комбобокс с определёнными индексами

Сообщение NickLion »

Пожалуйста:

Код: Выделить всё

    ui->wdr_mode->addItem( tr("point1"), QVariant(1) );
    ui->wdr_mode->addItem( tr("point2"), QVariant(2) );
    ui->wdr_mode->addItem( tr("point3"), QVariant(3) );

    ui->wdr_mode->setCurrentIndex( 1 );

    switch( ui->wdr_mode->itemData( ui->wdr_mode->currentIndex() ).toInt() ) {
    case 1:
        QMessageBox( QMessageBox::NoIcon, windowTitle(), tr( "Point1" ) ).exec();
        break;
    case 2:
        QMessageBox( QMessageBox::NoIcon, windowTitle(), tr( "Point2" ) ).exec();
        break;
    case 3:
        QMessageBox( QMessageBox::NoIcon, windowTitle(), tr( "Point3" ) ).exec();
        break;
    }

Вместо QMessageBox().exec() вставляете что Вам надо.
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Qt: комбобокс с определёнными индексами

Сообщение IMB »

Дополнительной поиск привёл на http://www.forum.crossplatform.ru/lofivers....php/t5263.html
Насколько я понял - добавление было выполнено корректно, а обработка нет.
Привёл обработку к виду:

Код: Выделить всё

int num = ui->wdr_mode->itemData(index, Qt::UserRole).toInt();
    switch (num) {
    case 1:
        ....................
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Qt: комбобокс с определёнными индексами

Сообщение IMB »

Возникла проблема с установкой определённого значения комбобокса на основании внешних данных.
При нажатии на кнопку считывается значение комбобокса и отправляется на сервер:

Код: Выделить всё

void MainWindow::on_wdr_set_mode_clicked()
{
    send_command(COMMAND_WDR_SET_MODE,
                 ui->wdr_mode->itemData(ui->wdr_mode->currentIndex(), Qt::UserRole).toInt());
}

Ту вроде проблем нет.
В ответ на другую команду сервер должен вернуть текущий режим работы WDR, который необходимо отобразить в комбобоксе:

Код: Выделить всё

ui->wdr_mode->setItemData(data[0], QVariant(data[0]), Qt::UserRole);

Но данный способ работает не корректно.
Подскажите?
Спасибо.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Qt: комбобокс с определёнными индексами

Сообщение NickLion »

Текущим сделать пункт с "кодом" xxx?
Тогда так:

Код: Выделить всё

int idx = ui->wdr_mode->findData(xxx);
ui->wdr_mode->setCurrentIndex(idx);
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Qt: комбобокс с определёнными индексами

Сообщение IMB »

NickLion, не затруднит объяснить почему не работал мой способ?
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Qt: комбобокс с определёнными индексами

Сообщение NickLion »

IMB, не затруднит :) Наверное, из-за неверного понимания работы методов. В общем, смотрите, есть у нас QComboBox, в нём пунткы (массив, поэтому индексы всегда 0, 1, 2, etc). Массив представим как массив структур - Текст+Код (UserData).
получаем что-то вроде:

Код: Выделить всё

№  Text   Code  Current
0  Item10  10
1  Item20  20     *
2  Item21  21
3  Item30  30

setItemData(a,b) в строчку с № a в колонку Code заносит значение b. И всё. А чтобы сделать активной строчку с Code b, надо сначала получить её номер - через findData, а затем сделать текущей строчку с полученным номером.
Спасибо сказали: