Russian Qt Forum

Qt => Model-View (MV) => Тема начата: neosapient от Январь 28, 2010, 13:11



Название: Как в QSqlRelationalTableModel получить первичный индекс ?
Отправлено: 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();



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

Сам я QSqlRelationalTableModel никогда не использовал, поэтому только советую способы.


Название: Re: Как в QSqlRelationalTableModel получить первичный индекс ?
Отправлено: neosapient от Январь 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

Подскажите, как в рамках описанного подхода выгрузить данные без "группировки/схлопывания" ?


Название: Re: Как в QSqlRelationalTableModel получить первичный индекс ?
Отправлено: mwChief от Апрель 02, 2011, 19:13
Тема старая, но столкнулся с аналогичной проблемой и хочу спросить не нашел ли кто-то решения? Пока единственное что пришло в голову это убирать связь между таблицами, получать индекс, а потом возвращать обратно. При этом дважды приходится вызывать model->select().


Название: Re: Как в QSqlRelationalTableModel получить первичный индекс ?
Отправлено: hank от Апрель 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();


Название: Re: Как в QSqlRelationalTableModel получить первичный индекс ?
Отправлено: mwChief от Апрель 07, 2011, 14:08
Спасибо за ответ, интересный костыль :).
Сам я сначала пробовал сохранять все id отдельно, но потом мне удалось вообще уйти от необходимости получать этот id.

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


Название: Re: Как в QSqlRelationalTableModel получить первичный индекс ?
Отправлено: kkmspb от Май 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());

Думаю идея понятна.


Название: Re: Как в QSqlRelationalTableModel получить первичный индекс ?
Отправлено: kkmspb от Февраль 03, 2023, 18:55
Хочу поделится, мы сделали свой вариант QSqlRelationalTableModel и заодно к нему новое развитие QTableView, и получилась готовая таблица PblTableDlg, у которой реализованы внешние связи, комбобоксы, чекбоксы, основные кнопки, поиск и чего там уже только нет... Настраивается все элементарно.

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

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

p@kkmspb.ru Павел