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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSqlTableModel и индекс в TableView  (Прочитано 6862 раз)
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
не знал тут создать тему или в разделе для новичков, т.к. думаю проблема не такая уж и сложная.  Хотя рылся в манах и подходящей функции или связки функций не подобрал В замешательстве
Записан
Igore
Гость
« Ответ #1 : Март 01, 2012, 09:57 »

Можно через model::data(const QModelIndex & index, Qt::UserRole). Для Qt::UserRole возвратить oid, только зачем? Для редактирования и удаления он не нужен, при добавлении он не известен.
Записан
bez_glaz
Гость
« Ответ #2 : Март 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]
Только не понял назначение второго параметра в функции. Описание мана через переводчик "Возвращает данные, хранящиеся в данной роли предметов, упомянутых в индексе."  Что за роль ? Интовская )
Записан
Igore
Гость
« Ответ #3 : Март 01, 2012, 10:20 »

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

Реализуя так
по клику перехожу на слот
Код:
void MainWindow::ChildRecordForObj(QModelIndex index)
{
   QVariant rec = modelHard->data(index,1);
}

в дебаге invalid значение rec   Грустный
Записан
bez_glaz
Гость
« Ответ #5 : Март 01, 2012, 15:28 »

Можно через model::data(const QModelIndex & index, Qt::UserRole). Для Qt::UserRole возвратить oid, только зачем? Для редактирования и удаления он не нужен, при добавлении он не известен.
Уточнение. Только Qt::UserRole возвращает oid ?
Записан
Странник
Гость
« Ответ #6 : Март 01, 2012, 15:43 »

Код:
void MainWindow::ChildRecordForObj(QModelIndex index)
{
   QVariant rec = modelHard->index(index.row(), oidColumn).data();
}
где oidColumn - индекс(номер) столбца oid
« Последнее редактирование: Март 01, 2012, 15:46 от Странник » Записан
bez_glaz
Гость
« Ответ #7 : Март 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)
Записан
Igore
Гость
« Ответ #8 : Март 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
« Последнее редактирование: Март 01, 2012, 16:39 от Igore » Записан
bez_glaz
Гость
« Ответ #9 : Март 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
Код:
_getOid(index);
  - это какая то определённая функция Непонимающий К какому класса эта функция принадлежит ?
Записан
bez_glaz
Гость
« Ответ #10 : Март 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
ссылка интересненькая, но вот мою проблему не решило
Код:
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");
всё корректно отобразило!
Записан
Igore
Гость
« Ответ #11 : Март 02, 2012, 11:50 »

Так, довай сначала.
У тебя есть таблица list_obj в которой есть поле oid, когда ты делаешь model->select(), у тебя это поле тоже должно выбраться. Значит ты каким то образом его убираешь. Самый правильный вариант это tableView->hideColumn(), во view данные не отображены, но они доступны.

Цитировать
Работаю в PSQL, и в таблице list_obj есть oid, он естественно в таблицу не выводится.
Я не вижу ничего естественного что он сам не выводится. Для чего тебе вообще нужен oid? Для редактирования, удаления, добавление в QSqlTableModel он не нужен.
Записан
bez_glaz
Гость
« Ответ #12 : Март 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 и по нему вообще без проблем всё будит.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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