crossplatform.ru

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

История благодарностей участнику mva ::: Спасибо сказали: 3 раз(а)
Дата поста: В теме: За сообщение: Спасибо сказали:
10.7.2009, 10:47 QSqlRelationalTableModel: как получить значение
...Упс! А я и забыл, что Qt просто подменяет значение ключа...

Тогда такие варианты:
1. Получать значение ключа до установления реляции.
2. В исходной таблице заводить копию поля 2.

Вообще-то я тоже недавно столкнулся с этой проблемой и мне пришлось создать собственный класс на основе QSqlRelationalTableModel чтобы "доделать" реляции в Qt. Сейчас я уже и забыл про эту проблемку...
b10t,
24.6.2009, 11:02 Хочу изменить порядок обновления данных в QSqlTableModel
Решил я эту задачку... Пришлось изучать исходный код в части работы с базами данных. Как оказалось в этом плане Qt работает довольно примитивно. При использовании политики OnFieldChange результат изменений ячейки данных в Grid сначала отправляется на сервер, а затем для того, чтобы отобразить эти изменения, посылается запрос на загрузку всех данных... Это очень неэффективно... При использовании других политик происходит примерно то же самое, только с задержкой по времени. Для OnManualSubmit - изменения загружаются после команды submilAll. Но в этом случае изменения сохраняются в буфере и отображаются в виджете Grid. Этот момент я и использовал.

После множества экспериментов все свелось к простому дочернему классу:
class MySqlTableModel : public QSqlTableModel {
public:
    MySqlTableModel();
    bool setData(const QModelIndex &, const QVariant &, int);
};

MySqlTableModel::MySqlTableModel() : QSqlTableModel() {
    setEditStrategy(QSqlTableModel::OnManualSubmit);
}

bool MySqlTableModel::setData(const QModelIndex &index, const QVariant &value, int role) {
    bool lResult = false;
    lResult = QSqlTableModel::setData(index, value, role);
    if (lResult) {
        QSqlRecord rec = record(index.row());
        rec.setValue(index.column(), value);
        rec.setGenerated(index.column(), true);
        lResult = updateRowInTable(index.row(), rec);
    }
    return lResult;
}


При использовании этого класса вместо QSqlTableModel нет необходимости вызова submitAll для сохранении данных на сервере, хотя здесь и используется политика OnManualSubmit. Изменения сохраняются на сервере сразу, как только мы перемещаемся на другую ячейку, при этом фокус курсора не теряется (не изменяется). Это то, что мне и требовалось.


Чем-то этот вариант похож на предложение Литкевича Юрия.
512es, radislav72,

RSS Текстовая версия Сейчас: 12.11.2019, 1:15