Russian Qt Forum
Апрель 25, 2024, 13:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как в QSqlRelationalTableModel получить первичный индекс ?  (Прочитано 10272 раз)
neosapient
Гость
« : Январь 28, 2010, 13:11 »

Здравствуйте.

Есть две связаных таблицы. Первая таблица Servers {ID int; Name varchar(16);}, перечисляет список возможных серверов. Вторая таблица Clients {ServerID int; Login int; Password varchar(16);}, перечисляет всех клиентов на каждом сервере. Присутствует связь между таблицами "один  Servers.ID ко многим  Clients.ServerID".

Реализовал следующую схему подключения одной таблицы к дгругой
Код:
QSqlRelationalTableModel *model = QSqlRelationalTableModel ();
model->select();
model->setTable("Clients");
model->setRelation(0, QSqlRelation("Servers", "ID", "Name"));

Теперь собственно вопрос: как мне из модели получить числовой идентификатор сервера Clients.ServerID ? Проблема в том, что мне возвращается значение переменной Servers.Name.
Код:
qDebug() << model->data(model->index(row,0)).toString();

« Последнее редактирование: Январь 28, 2010, 13:44 от neosapient » Записан
MoPDoBoPoT
Гость
« Ответ #1 : Январь 28, 2010, 13:58 »

Насчет этого есть 2 мысли:
1. Метод data() со 2-ым параметром по умолчанию возвращает значение данных с ролью Qt::DisplayRole (то есть то, что надо отобразить). Если попробовать вызвать так model->data(model->index(row,0), Qt::EditRole), то возможно получим реальные данные (то есть внешний ключ).
2. Попробовать вытащить через SqlRelationalTableModel::relationModel()

Сам я QSqlRelationalTableModel никогда не использовал, поэтому только советую способы.
Записан
neosapient
Гость
« Ответ #2 : Январь 28, 2010, 15:37 »

Цитировать
1. Метод data() со 2-ым параметром по умолчанию возвращает значение данных с ролью Qt::DisplayRole (то есть то, что надо отобразить). Если попробовать вызвать так model->data(model->index(row,0), Qt::EditRole), то возможно получим реальные данные (то есть внешний ключ).
Подход не сработал. Так же возвращается Servers.Name


Цитировать
2. Попробовать вытащить через SqlRelationalTableModel::relationModel()
Подход сработал частично. Содержимое ячеек "группируется/схлопывается" (точного термина не подобрать).

Код:
// То есть я меняю строчку
qDebug() << model->data(model->index(row,0)).toString();
// на две строчки
QSqlTableModel * modelColumn = model->relationModel(0);
qDebug() << modelColumn->data(modelColumn->index(row,0)).toString();

В итоге у меня есть таблица Clients
ServerIDLoginPassword
1101Pass101
1102Pass102
1103Pass103
1104Pass104
2201Pass201
2202Pass202
2203Pass203

Мне возвращается таблица
1
2

Хотя я хочу получить
1
1
1
1
2
2
2

Подскажите, как в рамках описанного подхода выгрузить данные без "группировки/схлопывания" ?
« Последнее редактирование: Январь 28, 2010, 18:24 от neosapient » Записан
mwChief
Гость
« Ответ #3 : Апрель 02, 2011, 19:13 »

Тема старая, но столкнулся с аналогичной проблемой и хочу спросить не нашел ли кто-то решения? Пока единственное что пришло в голову это убирать связь между таблицами, получать индекс, а потом возвращать обратно. При этом дважды приходится вызывать model->select().
Записан
hank
Гость
« Ответ #4 : Апрель 07, 2011, 12:01 »

Так не подойдёт?

Код
C++ (Qt)
QSqlQuery q = QSqlQuery(DB);
q.exec("SELECT ServerID FROM Clients ORDER BY ServerID ASC");

Ну и потом берём нужную строку:

Код
C++ (Qt)
q.seek(i, false);
qDebug() << q.value(0).toInt();
Записан
mwChief
Гость
« Ответ #5 : Апрель 07, 2011, 14:08 »

Спасибо за ответ, интересный костыль Улыбающийся.
Сам я сначала пробовал сохранять все id отдельно, но потом мне удалось вообще уйти от необходимости получать этот id.

Также остается непонятным почему вариант с Qt::EditRole не работает. Может это баг Qt?
Записан
kkmspb
Новичок

Offline Offline

Сообщений: 4


Просмотр профиля
« Ответ #6 : Май 22, 2022, 18:15 »

Хоть вопрос и старый, но в поиске выдается актуальном , 2022г.

Для Qt 4.8.1 давече решал проблему с  id значением поля внешней связи через лайфхак исходников qt и вроде все работает как надо:

QString QSqlRelationalTableModel::selectStatement() const
......
            //!!! my
            fList.append(QLatin1String(", "));
            fList.append(relTableAlias);
            fList.append(QLatin1String("."));
            fList.append(relation.indexColumn());
            fList.append(QLatin1String(" as "));
            fList.append(relation.tableName());
            fList.append(QLatin1String("_"));
            fList.append(relation.indexColumn());

Думаю идея понятна.
Записан
kkmspb
Новичок

Offline Offline

Сообщений: 4


Просмотр профиля
« Ответ #7 : Февраль 03, 2023, 18:55 »

Хочу поделится, мы сделали свой вариант QSqlRelationalTableModel и заодно к нему новое развитие QTableView, и получилась готовая таблица PblTableDlg, у которой реализованы внешние связи, комбобоксы, чекбоксы, основные кнопки, поиск и чего там уже только нет... Настраивается все элементарно.

https://kkmspb.ru/development/Qt/database-sql/Fork-Sql/

https://github.com/PavelDorofeev/Fork-Sql-Qt-4.8.1--SQLite-3--relations--calc-fields

p@kkmspb.ru Павел

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.127 секунд. Запросов: 23.