crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> QComboBox
eldar85
  опции профиля:
сообщение 15.7.2010, 10:18
Сообщение #1


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

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

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

ui->comboBox->addItems(cities);


......


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

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

в слоте попадая в свич уже присваивалось значение уникальное города, но это все очень грамоздко, так как иногда городов очень много.
нельзя ли сразу как то присвоить значение городу???
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 15.7.2010, 10:28
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


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

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
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 21
Регистрация: 9.12.2008
Пользователь №: 450

Спасибо сказали: 0 раз(а)




Репутация:   1  


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

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
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 172
Регистрация: 7.5.2009
Из: Москва
Пользователь №: 738

Спасибо сказали: 44 раз(а)




Репутация:   9  


Еще можно воспользоваться setModel(QAbstractItemModel * model) + setModelColumn(int visibleColumn). Удобно при загрузки данных из БД.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 15.7.2010, 11:10
Сообщение #5


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(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
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(eldar85 @ 15.7.2010, 15:10) *
а каким сигналом вызавать его лучше?
что вызывать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 15.7.2010, 12:39
Сообщение #7


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

Сообщение отредактировал eldar85 - 15.7.2010, 12:41
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 15.7.2010, 12:42
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


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

В слоте в переменной text получаешь название города и достаешь его id из map.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DIMEDROLL
  опции профиля:
сообщение 15.7.2010, 13:52
Сообщение #9


Участник
**

Группа: Участник
Сообщений: 165
Регистрация: 28.9.2008
Из: Киев
Пользователь №: 304

Спасибо сказали: 23 раз(а)




Репутация:   0  


зачем возится с 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();
}


Сообщение отредактировал DIMEDROLL - 15.7.2010, 14:15
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 15.7.2010, 14:19
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


DIMEDROLL, согласен, так проще. И QVariant позволит помещать множество типов в себя.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 2.4.2020, 13:10