Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: QComboBox
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt GUI
eldar85
Интерисует такая ситуация, нужно создать comboBox в котором будут содержаться города к примеру:
москва
питер
новосибирск
....
и привязать к каждому городу уникальное значение. К примеру выбрав из списка москву в значении получить установленное значение:
москва = 123
питер = 345
новосибирск = 678

до этого я делал так

QStringList cities;
cities << "Москва" << "Питер" << "Новосибирск";

ui->comboBox->addItems(cities);


......


и потом в слоте помещаал в switch()

значения городов и при выборе города выдается поочередное число, получается москва=1, питер=2, новосибирск=3...

в слоте попадая в свич уже присваивалось значение уникальное города, но это все очень грамоздко, так как иногда городов очень много.
нельзя ли сразу как то присвоить значение городу???
BRE
Это можно сделать по разному.
Как вариант:

QMap<QString, int> cities;
cities[ "Москва" ] = 123;
cities[ "Питер" ] = 345;
cities[ "Новосибирск" ] = 678;

ui->comboBox->addItems( cities.keys() );

// В слоте по имени получить id
int id = cities[ text ];
Wlad
Для привязке к строке можно задать пользовательские данные:

void QComboBox::addItem ( const QString & text, const QVariant & userData = QVariant() );

а потом читать их:

QVariant QComboBox::itemData ( int index, int role = Qt::UserRole ) const

см. Справку! :)
MoPDoBoPoT
Еще можно воспользоваться setModel(QAbstractItemModel * model) + setModelColumn(int visibleColumn). Удобно при загрузки данных из БД.
eldar85
Цитата(BRE @ 15.7.2010, 14:28) *
Это можно сделать по разному.
Как вариант:

QMap<QString, int> cities;
cities[ "Москва" ] = 123;
cities[ "Питер" ] = 345;
cities[ "Новосибирск" ] = 678;

ui->comboBox->addItems( cities.keys() );

// В слоте по имени получить id
int id = cities[ text ];



а каким сигналом вызавать его лучше?
Litkevich Yuriy
Цитата(eldar85 @ 15.7.2010, 15:10) *
а каким сигналом вызавать его лучше?
что вызывать?
eldar85
слот)) у меня же подгрузиться это все при запуске программы, но когда я буду менять город в этом списке, он же должен сигнал отправить моему слоту...
BRE
void QComboBox::currentIndexChanged ( const QString & text ) [signal]

В слоте в переменной text получаешь название города и достаешь его id из map.
DIMEDROLL
зачем возится с map'ом если в QComboBox нужная функциональность уже есть
Wlad, правильно сказал, добавляешь:
ui->comboBox->addItem("Москва", QVariant(123));
ui->comboBox->addItem("Питер", QVariant(222));


получаешь
void MyWidget::on_comboBox_currentIndexChanged(int index) {
int number = ui->comboBox->itemData (index, int role = Qt::UserRole ).toInt();
}
Litkevich Yuriy
DIMEDROLL, согласен, так проще. И QVariant позволит помещать множество типов в себя.
eldar85
спасибо за ответы)) выручили)
Алексей1153
Цитата(Litkevich Yuriy @ 15.7.2010, 17:19) *
DIMEDROLL, согласен, так проще. И QVariant позволит помещать множество типов в себя.

А я не согласен :) Ведь обычно список городов будет использовать не только в списке, а ещё в паре мест. Поэтому заставлять элемент управления быть контейнером не кузяво. Но одноразово пойдёт, конечно
igor_bogomolov
Цитата(Алексей1153 @ 15.7.2010, 15:47) *
А я не согласен Ведь обычно список городов будет использовать не только в списке, а ещё в паре мест. Поэтому заставлять элемент управления быть контейнером не кузяво.
+1
Kilel
Вот тоже столкнулся с такой же проблемой неужто нет более элегантного метода!!? типа:
QComboBox *point;
....
QObject::connect(bd,SIGNAL(search_name_end(QStringList)),ui->point,SLOT(update()));

слот "setItems" отсутствует, это только функция.

Возможно ли как нить привести к выше изложенному виду ?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.