Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt GUI _ QComboBox

Автор: eldar85 15.7.2010, 10:18

Интерисует такая ситуация, нужно создать comboBox в котором будут содержаться города к примеру:
москва
питер
новосибирск
....
и привязать к каждому городу уникальное значение. К примеру выбрав из списка москву в значении получить установленное значение:
москва = 123
питер = 345
новосибирск = 678

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

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

ui->comboBox->addItems(cities);


......


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

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

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

Автор: BRE 15.7.2010, 10:28

Это можно сделать по разному.
Как вариант:

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

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

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

Автор: Wlad 15.7.2010, 10:35

Для привязке к строке можно задать пользовательские данные:

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

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

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

см. Справку! :)

Автор: MoPDoBoPoT 15.7.2010, 11:02

Еще можно воспользоваться setModel(QAbstractItemModel * model) + setModelColumn(int visibleColumn). Удобно при загрузки данных из БД.

Автор: eldar85 15.7.2010, 11:10

Цитата(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 15.7.2010, 11:28

Цитата(eldar85 @ 15.7.2010, 15:10) *
а каким сигналом вызавать его лучше?
что вызывать?

Автор: eldar85 15.7.2010, 12:39

слот)) у меня же подгрузиться это все при запуске программы, но когда я буду менять город в этом списке, он же должен сигнал отправить моему слоту...

Автор: BRE 15.7.2010, 12:42

void QComboBox::currentIndexChanged ( const QString & text ) [signal]

В слоте в переменной text получаешь название города и достаешь его id из map.

Автор: DIMEDROLL 15.7.2010, 13:52

зачем возится с 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 15.7.2010, 14:19

DIMEDROLL, согласен, так проще. И QVariant позволит помещать множество типов в себя.

Автор: eldar85 15.7.2010, 14:25

спасибо за ответы)) выручили)

Автор: Алексей1153 15.7.2010, 14:47

Цитата(Litkevich Yuriy @ 15.7.2010, 17:19) *
DIMEDROLL, согласен, так проще. И QVariant позволит помещать множество типов в себя.

А я не согласен :) Ведь обычно список городов будет использовать не только в списке, а ещё в паре мест. Поэтому заставлять элемент управления быть контейнером не кузяво. Но одноразово пойдёт, конечно

Автор: igor_bogomolov 15.7.2010, 14:50

Цитата(Алексей1153 @ 15.7.2010, 15:47) *
А я не согласен Ведь обычно список городов будет использовать не только в списке, а ещё в паре мест. Поэтому заставлять элемент управления быть контейнером не кузяво.
+1

Автор: Kilel 21.7.2010, 14:38

Вот тоже столкнулся с такой же проблемой неужто нет более элегантного метода!!? типа:
QComboBox *point;
....
QObject::connect(bd,SIGNAL(search_name_end(QStringList)),ui->point,SLOT(update()));

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

Возможно ли как нить привести к выше изложенному виду ?

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)