Russian Qt Forum

Qt => Базы данных => Тема начата: bez_glaz от Март 01, 2012, 09:37



Название: QSqlTableModel и индекс в TableView
Отправлено: bez_glaz от Март 01, 2012, 09:37
Добрый день.
Делаю
Код:
       
    modelObj = new QSqlTableModel();
    modelObj->setTable("list_obj");
    modelObj->select();
    modelObj->setHeaderData(0, Qt::Horizontal, QString::fromUtf8("Название объекта"));
    modelObj->setHeaderData(1, Qt::Horizontal, QString::fromUtf8("Индикация"));
    modelObj->setHeaderData(2, Qt::Horizontal, QString::fromUtf8("Картиночка"));
    ui->ListObj->setModel(modelObj);
Работаю в PSQL, и в таблице list_obj есть oid, он естественно в таблицу не выводится.
Далее я делаю обработку клика на любую ячейку, и он мне возвращает индексы row и cols той ячейки куда я произвёл клик.
Теперь зная индекс строки в TableView я должен как-то выудить oid для этой записи.
Как это сделать ?
PS
не знал тут создать тему или в разделе для новичков, т.к. думаю проблема не такая уж и сложная.  Хотя рылся в манах и подходящей функции или связки функций не подобрал :-\


Название: Re: QSqlTableModel и индекс в TableView
Отправлено: Igore от Март 01, 2012, 09:57
Можно через model::data(const QModelIndex & index, Qt::UserRole). Для Qt::UserRole возвратить oid, только зачем? Для редактирования и удаления он не нужен, при добавлении он не известен.


Название: Re: QSqlTableModel и индекс в TableView
Отправлено: bez_glaz от Март 01, 2012, 10:13
Можно через model::data(const QModelIndex & index, Qt::UserRole). Для Qt::UserRole возвратить oid, только зачем? Для редактирования и удаления он не нужен, при добавлении он не известен.
Да, нашёл вот только что
QVariant QSqlTableModel::data ( const QModelIndex & index, int role = Qt::DisplayRole ) const [virtual]
Только не понял назначение второго параметра в функции. Описание мана через переводчик "Возвращает данные, хранящиеся в данной роли предметов, упомянутых в индексе."  Что за роль ? Интовская )


Название: Re: QSqlTableModel и индекс в TableView
Отправлено: Igore от Март 01, 2012, 10:20
Цитировать
Только не понял назначение второго параметра в функции. Описание мана через переводчик "Возвращает данные, хранящиеся в данной роли предметов, упомянутых в индексе."  Что за роль ? Интовская )
Почитай документацию http://harmattan-dev.nokia.com/docs/library/html/qt4/qt.html#ItemDataRole-enum (http://harmattan-dev.nokia.com/docs/library/html/qt4/qt.html#ItemDataRole-enum) и про Model-View, view получает данные через data, ты можешь для себя определить новые роли через Qt::UserRole, и получать через них любые данные которые не отображены во view.


Название: Re: QSqlTableModel и индекс в TableView
Отправлено: bez_glaz от Март 01, 2012, 15:27
Реализуя так
по клику перехожу на слот
Код:
void MainWindow::ChildRecordForObj(QModelIndex index)
{
   QVariant rec = modelHard->data(index,1);
}

в дебаге invalid значение rec   :(


Название: Re: QSqlTableModel и индекс в TableView
Отправлено: bez_glaz от Март 01, 2012, 15:28
Можно через model::data(const QModelIndex & index, Qt::UserRole). Для Qt::UserRole возвратить oid, только зачем? Для редактирования и удаления он не нужен, при добавлении он не известен.
Уточнение. Только Qt::UserRole возвращает oid ?


Название: Re: QSqlTableModel и индекс в TableView
Отправлено: Странник от Март 01, 2012, 15:43
Код:
void MainWindow::ChildRecordForObj(QModelIndex index)
{
   QVariant rec = modelHard->index(index.row(), oidColumn).data();
}
где oidColumn - индекс(номер) столбца oid


Название: Re: QSqlTableModel и индекс в TableView
Отправлено: bez_glaz от Март 01, 2012, 15:55
Код:
void MainWindow::ChildRecordForObj(QModelIndex index)
{
   QVariant rec = modelHard->index(index.row(), oidColumn).data();
}
где oidColumn - индекс(номер) столбца oid
Во первых, oid формируется автоматически, и не отображается в TableView при стандартном
Код:
...
modelHard->select();
ui->ListHard->setModel(modelHard);
...
Во вторых на любое интевское значение вместо oidColumn rec имеет значение (invalid)


Название: Re: QSqlTableModel и индекс в TableView
Отправлено: Igore от Март 01, 2012, 16:29
Можно через model::data(const QModelIndex & index, Qt::UserRole). Для Qt::UserRole возвратить oid, только зачем? Для редактирования и удаления он не нужен, при добавлении он не известен.
Уточнение. Только Qt::UserRole возвращает oid ?
Это ты должен сам написать, определяешь свою роль и поведение модели на нее
Код:
QVariant MyModel::data(const QModelIndex& index, int role) const
{
    if (!index.isValid())
        return QVariant();
    if (role == Qt::UserRole)
        return _getOid(index);
    else
        return QSqlTableModel::data(index, role);
}
У тебя такая ситуация? http://stackoverflow.com/questions/5767349/qtableview-qsqltablemodel-how-to-read-id-of-selected-row (http://stackoverflow.com/questions/5767349/qtableview-qsqltablemodel-how-to-read-id-of-selected-row)


Название: Re: QSqlTableModel и индекс в TableView
Отправлено: bez_glaz от Март 02, 2012, 08:47
Можно через model::data(const QModelIndex & index, Qt::UserRole). Для Qt::UserRole возвратить oid, только зачем? Для редактирования и удаления он не нужен, при добавлении он не известен.
Уточнение. Только Qt::UserRole возвращает oid ?
Это ты должен сам написать, определяешь свою роль и поведение модели на нее
Код:
QVariant MyModel::data(const QModelIndex& index, int role) const
{
    if (!index.isValid())
        return QVariant();
    if (role == Qt::UserRole)
        return _getOid(index);
    else
        return QSqlTableModel::data(index, role);
}
У тебя такая ситуация? http://stackoverflow.com/questions/5767349/qtableview-qsqltablemodel-how-to-read-id-of-selected-row (http://stackoverflow.com/questions/5767349/qtableview-qsqltablemodel-how-to-read-id-of-selected-row)
Код:
_getOid(index);
  - это какая то определённая функция ??? К какому класса эта функция принадлежит ?


Название: Re: QSqlTableModel и индекс в TableView
Отправлено: bez_glaz от Март 02, 2012, 09:11
Можно через model::data(const QModelIndex & index, Qt::UserRole). Для Qt::UserRole возвратить oid, только зачем? Для редактирования и удаления он не нужен, при добавлении он не известен.
Уточнение. Только Qt::UserRole возвращает oid ?
Это ты должен сам написать, определяешь свою роль и поведение модели на нее
Код:
QVariant MyModel::data(const QModelIndex& index, int role) const
{
    if (!index.isValid())
        return QVariant();
    if (role == Qt::UserRole)
        return _getOid(index);
    else
        return QSqlTableModel::data(index, role);
}
У тебя такая ситуация? http://stackoverflow.com/questions/5767349/qtableview-qsqltablemodel-how-to-read-id-of-selected-row (http://stackoverflow.com/questions/5767349/qtableview-qsqltablemodel-how-to-read-id-of-selected-row)
ссылка интересненькая, но вот мою проблему не решило
Код:
void MainWindow::ChildRecordForObj(QModelIndex index)
{
    QSqlRecord record= modelObj->record(index.row());
    QSqlField field = record.field("oid");
    int id = field.value().toInt();

}
в структуре field значение val - (invalid). Проверял если напишу вот так
Код:
QSqlField field = record.field("name");
всё корректно отобразило!


Название: Re: QSqlTableModel и индекс в TableView
Отправлено: Igore от Март 02, 2012, 11:50
Так, довай сначала.
У тебя есть таблица list_obj в которой есть поле oid, когда ты делаешь model->select(), у тебя это поле тоже должно выбраться. Значит ты каким то образом его убираешь. Самый правильный вариант это tableView->hideColumn(), во view данные не отображены, но они доступны.

Цитировать
Работаю в PSQL, и в таблице list_obj есть oid, он естественно в таблицу не выводится.
Я не вижу ничего естественного что он сам не выводится. Для чего тебе вообще нужен oid? Для редактирования, удаления, добавление в QSqlTableModel он не нужен.


Название: Re: QSqlTableModel и индекс в TableView
Отправлено: bez_glaz от Март 05, 2012, 09:59
Так, довай сначала.
У тебя есть таблица list_obj в которой есть поле oid, когда ты делаешь model->select(), у тебя это поле тоже должно выбраться. Значит ты каким то образом его убираешь. Самый правильный вариант это tableView->hideColumn(), во view данные не отображены, но они доступны.

Цитировать
Работаю в PSQL, и в таблице list_obj есть oid, он естественно в таблицу не выводится.
Я не вижу ничего естественного что он сам не выводится. Для чего тебе вообще нужен oid? Для редактирования, удаления, добавление в QSqlTableModel он не нужен.
При
Код:
model->select()
не выбираются поля с oid, я их сделал для связки PK FK с другой таблицей, но уже сейчас понимаю, что надо будит БД переделывать. Нагуглил, что встроенный oid в PG нужен для подсчёта записей или что-то в этом роде (типа сортировка по убыванию/возрастанию). Если проблема сегодня не разрешится, буду заводить отдельное поле самостоятельное - ID и по нему вообще без проблем всё будит.