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

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

Форум на CrossPlatform.RU _ Qt Разработка баз данных _ comboBox + БД

Автор: potkin 21.8.2010, 22:28

Есть таблица "post":

post
[postID] int auto_increment,
[name] text


Надо в "comboBox" отобразить поле "name", делаю так:

 ui->setupUi(this);

    model = new QSqlRelationalTableModel();
    model->setTable("post");
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    ui->comboBox->setModel(model);
    ui->comboBox->setModelColumn(model->fieldIndex("name"));


И надо, чтоб при выборе Итема в "comboBox" (поле "name") выбиралося и соответствующее ему значение "postID".
Есть возможности реализовать такое в Qt.
Потому что мне напрашивается только одно решение:
Какой то целочисленный массив заполнить полем "postID", а в "comboBox" запихнуть поле "name" и связать их, например по порядковому номеру.

Заранее спасибо.

Автор: Алексей1153 21.8.2010, 22:34

Наверное, спасёт вот это

Цитата
void QComboBox::setItemData ( int index, const QVariant & value, int role = Qt::UserRole )
Sets the data role for the item on the given index in the combobox to the specified value.

See also itemData().

:)

Автор: potkin 21.8.2010, 22:59

Цитата(Алексей1153 @ 21.8.2010, 22:34) *
Наверное, спасёт вот это
Цитата
void QComboBox::setItemData ( int index, const QVariant & value, int role = Qt::UserRole )
Sets the data role for the item on the given index in the combobox to the specified value.

See also itemData().

:)


Вручную заполнить ???
То есть вместо
ui->comboBox->setModel(model);
использовать в цикле:
ui->comboBox->setItemData(...);
???

Автор: Litkevich Yuriy 22.8.2010, 5:56

potkin, скажи, для чего ты используешь QSqlRelationalTableModel?

Цитата(potkin @ 22.8.2010, 2:28) *
Какой то целочисленный массив заполнить полем "postID", а в "comboBox" запихнуть поле "name" и связать их, например по порядковому номеру.
и это не понятно, зачем ещё что-то связывать, если есть таблица в БД в которой уже всё связанно?

Автор: potkin 22.8.2010, 15:07

Цитата(Litkevich Yuriy @ 22.8.2010, 5:56) *
potkin, скажи, для чего ты используешь QSqlRelationalTableModel?
Цитата(potkin @ 22.8.2010, 2:28) *
Какой то целочисленный массив заполнить полем "postID", а в "comboBox" запихнуть поле "name" и связать их, например по порядковому номеру.
и это не понятно, зачем ещё что-то связывать, если есть таблица в БД в которой уже всё связанно?


Ну так в КомбоБокс я заношу поле "name".
Пользователь выбирает какой-то из Итемов.
Но в конце концов надо получить поле "postID", чтоб занести в БД не поле "name", а его ID-шник.

Автор: 512es 5.9.2010, 16:19

может немного кривовато но я решил этот вопрос через QSqlQueryModel и запрос построенный таким образом:
"SELECT DISTINCT ON (postID) name FROM post;" (постгрес отсортирует результат по postID)
обязательное условие это то что postID должен быть autoincrement и номера в таблице должны идти строго по порядку, без разрывов.
postID получать по ui->comboBox->currentIndex()+1

вроде работает)) если кто предложит способ получше, буду рад ))

Автор: Алексей1153 5.9.2010, 16:27

способ лучше:

"SELECT postID name FROM post;" //поскольку автоинкремент, то есть предполагается уникальный ключ

postID получать из getItemData()

Автор: 512es 5.9.2010, 19:27

Алексей1153,
звучит заманчиво.. но что то я не видел метода getItemData().. Это разве QCombobox?

Автор: Алексей1153 5.9.2010, 19:45

очепятка ) Просто ItemData()

Автор: 512es 5.9.2010, 20:22

Алексей1153,
Для меня почему то это не работает..

привязываю к комбобоксу QSqlQueryModel с таким запросом: "SELECT name, postID FROM post;"
комбо заполняется нормально. остаётся выцепить postID.
Но ui->comboBox->itemData(ui->comboBox->currentIndex()) выдаёт всегда QVariant(, )

Автор: Алексей1153 5.9.2010, 21:10

512es, а ты как заполняешь комбу то, я не совсем понял

Автор: MoPDoBoPoT 5.9.2010, 22:43

Цитата(512es @ 5.9.2010, 17:19) *
обязательное условие это то что postID должен быть autoincrement и номера в таблице должны идти строго по порядку, без разрывов.

Слишком жёсткие ограничения, а то что выделено красным, для многопользовательского режима, выполнимо при определённых настройках сервера (если отключено кэширование значений последовательности).
Мне не понятно, в чём, собственно, загвоздка, ведь в заполненой QSqlQueryModel находится вся необходимая информация (поля "name" и "postID" уже "связаны" номером строки в модели). Таким образом, чтобы узнать postID для данного (выбранного) имени, надо сделать примерно следующее:
...
int row = ui->comboBox->currentIndex();
if (row = -1)
   return;

QModelIndex index = model->index(row, PostIdColumn);
if (!index.isValid())
   return;

if (!index.data().canConvert(QVariant::Int))
   return;

int postID = index.data().toInt();
...

Если хочется более универсального решения, то можно отнаследоваться от QComboBox и реализовать необходимый функционал:
- bool setModel(QAbstractItemModel *model, int idColumn, int visibleColumn)
- int currentId()
- void currentIdChanged(int id) [signal]
- ...

Автор: MaratQt 6.9.2010, 9:25

Есть не совсем правильный (точнее совсем не правильный) вариант. Можно с помощью setModelColumn менять текущий столбец на столбец айдишников, брать текущий текст и менять текущий столбец обратно.

Автор: 512es 7.9.2010, 15:55

MoPDoBoPoT,
Спасибо, попробовал.
В самом деле хороший способ дёргать значения по currentIndex() через модель =)

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