Russian Qt Forum

Qt => Базы данных => Тема начата: linuxoid от Август 15, 2007, 08:09



Название: Попытка преобразования QComboBox
Отправлено: linuxoid от Август 15, 2007, 08:09
Люди добрые подскажите как переделать QComboBox чтобы в нём в одном поле могло содержаться два значения(для моего случая нужно чтобы из таблицы показывалось в одном поле id_key_city и city_name - они связаны :?:


Название: Попытка преобразования QComboBox
Отправлено: SABROG от Август 15, 2007, 08:19
Запихнуть QPair в Qt::UserRole для каждого итема комбика.
Или Qt::UserRole - id_key_city, в Qt::UserRole+1 - city_name и т.д. Или ты хочешь разделить lineEdit кобмика на две части, типа кнопка комбика одна, а поля ввода 2 ?


Название: Попытка преобразования QComboBox
Отправлено: linuxoid от Август 15, 2007, 08:46
нужно стелать так чтобы поле комбика содержало id_key_city и city_name(для city_name   id_key_city это ид номер) из таблицы,а вообще id_key_city лучше сделать скрытым.Просто id_key_city нужен чтобы вставлять по нему в комбик имя города(city_name).И если можешь опиши немного подробнее)


Название: Попытка преобразования QComboBox
Отправлено: Emc от Август 15, 2007, 10:19
судя по функции setModelColumn ( int visibleColumn ) QComboBox способно отображать только одну колонку, но если у тебя один из параметров скрыт, то проблем нет -- изучай QStandardItemModel, или добавляй один из параметров через setItemData


Название: Re: Попытка преобразования QComboBox
Отправлено: Gryz от Август 15, 2007, 11:39
Цитата: "linuxoid"
Люди добрые подскажите как переделать QComboBox чтобы в нём в одном поле могло содержаться два значения(для моего случая нужно чтобы из таблицы показывалось в одном поле id_key_city и city_name - они связаны :?:

Отношение один к одному?


Название: Попытка преобразования QComboBox
Отправлено: linuxoid от Август 15, 2007, 14:31
сорри за тупой вопрос но что значит один к одному?


Название: Попытка преобразования QComboBox
Отправлено: Gryz от Август 15, 2007, 14:56
Т.е. выбор одного из значений однозначно определял второе.


Название: Попытка преобразования QComboBox
Отправлено: linuxoid от Август 15, 2007, 15:09
т.е. два значения в комбике [_]____]      id_key_city и city_name  ,id_key_city это id № для имени города city_name.     т.е. чтобы выбрать город я выбираю id_key_city


Название: Попытка преобразования QComboBox
Отправлено: SABROG от Август 15, 2007, 16:58
Если тебе нужно два поля ввода, то зачем ты извращаешься ? Ну возьми рядышком поставь QLineEdit и QComboBox, обрабатывай сигнал currentIndexChanged, внутри слота пихай в QLineEdit - id_key_city.

Или возьми QComboBox->lineEdit() и поставь ему setInputMask, тогда все будет вводится в одном поле. А потом через разделитель какой нибудь ":" строку разобъешь на два значения.


Название: Попытка преобразования QComboBox
Отправлено: Вячеслав от Август 16, 2007, 09:13
Млин .... чего-то я торможу - а код города нужен юзверю или нет ? Если да - делаешь  tableview И пихаешь его как popup, если нет - то ид в userdata(как уже говорили)


Название: Попытка преобразования QComboBox
Отправлено: linuxoid от Август 16, 2007, 09:41
мне надо не 2 поля ввода а два поля:как мне сделать следующее??
в первом отображается id_key_city с помощью sql запроса а во втором city_name с помощью того же sql запроса.  причём id_key_city это Уникальный номер для значений city_name!И если можно опиши с кодом пример QLineEdit и ComboBox плз

добавлено спустя 1 минуту:

 мне надо не 2 поля ввода а два поля:как мне сделать следующее??
в первом отображается id_key_city с помощью sql запроса а во втором city_name с помощью того же sql запроса.  причём id_key_city это Уникальный номер для значений city_name!И если можно опиши с кодом пример QLineEdit и ComboBox плз


Название: Попытка преобразования QComboBox
Отправлено: SABROG от Август 16, 2007, 10:44
Если ключ менять не надо, то QLabel + QComboBox. Обрабатываешь сигнал QComboBox - currentIndexChanged, внутри слота для этого сигнала берешь из поля cbMy->itemData(index) свой ID города и пихаешь его в QLabel. Далее обрабатываешься сигнал activated у QComboBox, он приходит после того как пользователь изменит или не изменит имя города и нажмет Enter в поле. Там делаешь проверку, если текст не изменился через cbMy->lineEdit()->isModified() метод QComboBox'a. Если возвращается true, значит пользователь изменил название, берешь ключ города из itemData(index) и составляешь SQL запрос типа:

Код:

QString("UPDATE mytable SET city_name='%1' WHERE city_id=%2;").arg(cbMy->currentText()).arg(cbMy->itemData(cbMy->currentIndex()).toInt());


Соответственно надо не забыть этими ключами заполнить ComboBox:

cbMy->addItem(city_name, city_key);

(http://img186.imageshack.us/img186/8389/comboxn2.jpg)


Название: Попытка преобразования QComboBox
Отправлено: linuxoid от Август 16, 2007, 10:55
Спасибо


Название: Попытка преобразования QComboBox
Отправлено: SABROG от Август 16, 2007, 11:02
Насчет SQL запросов, лучше использовать всякие bindValue(), т.к. этот метод сам следит за тем, чтобы текст был в кавычках (escaped) и небыло возможности SQL Injection или покрошить базу только потому, что пользователь поставил запятых, кавычек разного рода в имени города.