crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QSqlRelationalTableModel - не редактируются данные
Rudel
  опции профиля:
сообщение 16.6.2009, 22:33
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 1
Регистрация: 16.6.2009
Пользователь №: 830

Спасибо сказали: 0 раз(а)




Репутация:   0  


Пишу программу с использованием SQLITE. База данных создается, удалением, добавление, поиск - сделал. Однако редактирование не работает. Данные просто не меняются. Поиск по нету ничего не дал.
Есть ли какие-нибудь определенные моменты, которые могут привести к такому рода поведению?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 16.6.2009, 23:08
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Покажи код, ошибки какие-нибудь возвращаются?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
LonelyDreamer
  опции профиля:
сообщение 25.6.2009, 8:05
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 25.6.2009
Пользователь №: 850

Спасибо сказали: 0 раз(а)




Репутация:   0  


Аналогичная проблема. На форме два QTableView для отображения данных из двух таблиц БД (SQLite3). Для одной таблицы используется QSqlTableModel и всё нормально (редактируется), для второй QSqlRelationalTableModel и данные не редактируются. Для OnFieldChange после редактирования данных в QTableView сразу же возвращается старое значение. Для OnRowChange после редактирования в QTableView отображатеся новое значение, но в БД остается старое, и после редактирования какой-нибудь другой ячейки в QTableView старое значение возвращается обратно.

Как заставить QTableView\QSqlRelationalTableModel вносить изменения в БД так же, как это делают QTableView\QSqlTableModel?

Код, где создаются Model/View:

Раскрывающийся текст

void DicDialog::showEvent(QShowEvent *event)
{
    db = QSqlDatabase::database("tutor_connection", false);
    originalModel = new QSqlTableModel(this, db);
    originalModel->setTable("original_phrases");
    originalModel->setEditStrategy(QSqlTableModel::OnFieldChange);
    originalModel->setSort(1, Qt::AscendingOrder);
    originalModel->setHeaderData(0, Qt::Horizontal, tr("id"));
    originalModel->setHeaderData(1, Qt::Horizontal, tr("phrase"));
    originalModel->setHeaderData(2, Qt::Horizontal, tr("count"));
    originalModel->select();

    originalView->setModel(originalModel);
    originalView->setSelectionBehavior(QAbstractItemView::SelectItems);
    originalView->setSelectionMode(QAbstractItemView::SingleSelection);
    originalView->setColumnHidden(0, true);
    originalView->setEditTriggers(QAbstractItemView::DoubleClicked |
                                  QAbstractItemView::SelectedClicked |
                                  QAbstractItemView::EditKeyPressed |
                                  QAbstractItemView::AnyKeyPressed);

    QHeaderView *header = originalView->horizontalHeader();
    header->setResizeMode(1, QHeaderView::Stretch);
    header->setResizeMode(2, QHeaderView::ResizeToContents);



    cardsRelModel = new QSqlRelationalTableModel(this, db);
    cardsRelModel->setTable("cards");
    cardsRelModel->setRelation(1, QSqlRelation("original_phrases", "id", "phrase"));
    cardsRelModel->setRelation(2, QSqlRelation("translated_phrases", "id", "phrase"));
    //cardsRelModel->setEditStrategy(QSqlTableModel::OnFieldChange);
    cardsRelModel->setEditStrategy(QSqlTableModel::OnRowChange);
    cardsRelModel->setSort(1, Qt::AscendingOrder);
    cardsRelModel->setHeaderData(0, Qt::Horizontal, tr("id"));
    cardsRelModel->setHeaderData(1, Qt::Horizontal, tr("original"));
    cardsRelModel->setHeaderData(2, Qt::Horizontal, tr("translated"));
    cardsRelModel->setHeaderData(3, Qt::Horizontal, tr("points"));
    cardsRelModel->setHeaderData(4, Qt::Horizontal, tr("date/time"));
    cardsRelModel->select();

    cardsView->setModel(cardsRelModel);
    cardsView->setItemDelegate(new QSqlRelationalDelegate(this));
    //cardsView->setItemDelegateForColumn(1, new QSqlRelationalDelegate(this));
    //cardsView->setItemDelegateForColumn(2, new QSqlRelationalDelegate(this));
    cardsView->setSelectionBehavior(QAbstractItemView::SelectItems);
    cardsView->setSelectionMode(QAbstractItemView::SingleSelection);
    cardsView->setColumnHidden(0, true);
    cardsView->setEditTriggers(QAbstractItemView::DoubleClicked |
                               QAbstractItemView::SelectedClicked |
                               QAbstractItemView::EditKeyPressed |
                               QAbstractItemView::AnyKeyPressed);

    header = cardsView->horizontalHeader();
    header->setResizeMode(1, QHeaderView::Stretch);
    header->setResizeMode(2, QHeaderView::Stretch);
    header->setResizeMode(3, QHeaderView::ResizeToContents);
    header->setResizeMode(4, QHeaderView::Stretch);
}

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mva
  опции профиля:
сообщение 25.6.2009, 9:20
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 104
Регистрация: 15.3.2009
Из: Киров
Пользователь №: 615

Спасибо сказали: 3 раз(а)




Репутация:   0  


Думаю, что экземпляр QSqlRelationalTableModel не может по каким-то причинам сохранить данные на сервере. Если бы это был отдельный процесс с сервером, то можно было бы посмотреть обмен данными с помощью сниффера. Но SQLite работает в этом же процессе, поэтому сниффером не получится.
Надо искать способ вывести сообщение об ошибке через какое-нибудь событие или сигнал командами

qDebug() << db.lastError().text()
или
qDebug() << db.driver().lastError().text()

Например, можно политику установить в OnManualSubmit, сделать на форме кнопку "Обновить" и к ней привязать команду submitAll(), а следом вывод сообщений об ошибках, как написано выше.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 25.6.2009, 9:39
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


LonelyDreamer, как себя ведёт пример %QTDIR%\examples\sql\relationaltablemodel ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
LonelyDreamer
  опции профиля:
сообщение 25.6.2009, 11:51
Сообщение #6


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 25.6.2009
Пользователь №: 850

Спасибо сказали: 0 раз(а)




Репутация:   0  


Пример %QTDIR%\examples\sql\relationaltablemodel после небольшой доработки для работы с файлами заработал как надо. После комментирования практически всего своего кода, когда результат не изменился, полез посмотреть как создаются таблицы и обнаружил, что для этой таблицы пропустил PRIMARY KEY. В этом и заключалась проблема.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 25.6.2009, 17:12
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Ну вот и хорошо, разобрался. А вообще проверять на стандартных примерах стоит, так как другим людям всегда проще запустить стандартный пример и посмотреть поведение.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 0:13