Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Обновление нескольких QTableView одновременно
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Модель/Представление
Tarigan
Добрый день.
Есть 1 таблица в БД, 2 QSqlTableModel+QTableView и QSqlQuery+QTablEView подключенные к этой таблице.
//1st model
    phoneModel = new QSqlTableModel(this,db->getDB());
    phoneModel->setEditStrategy(QSqlTableModel::OnFieldChange);
    phoneModel->setTable("ORDERS");
    phoneModel->setFilter(QString("orders.status = 1");
    phoneModel->sort(COLUMN_ORDERS_ORDERDATE,Qt::AscendingOrder);
    phoneModel->select();
    dspPhoneTable->setModel(phoneModel);

    //2nd model
    backModel = new QSqlTableModel(this,db->getDB());
    backModel->setEditStrategy(QSqlTableModel::OnFieldChange);
    backModel->setTable("ORDERS");
    backModel->setFilter(QString("orders.status <> 1");
    backModel->setSort(COLUMN_ORDERS_ORDERDATE,Qt::AscendingOrder);
    backModel->select();
    dspBackTable->setModel(backModel);

    //3rd nodel
    drvModel = new QSqlQueryModel();
    drvModel->setQuery("put_query_here",db->getDB());
    drvActTable->setModel(drvModel);

Как лучше реализовать обновление информации во всех трех моделях при добавлении новой и/или изменении уже имеющейся в 1 или 2?
sidsukana
Создать слоты в моделях, с которыми соединить сигнал, который вызывать при обновлении?
Tarigan
Спасибо, кэп :)
Проблема у меня именно в реализации слотов с обновлением. Изначально делал submitAll(), но этот вариант никуда не годится.
Tarigan
К примеру, вот:
При добавлении записи в модель 1 срабатывает слот, подключенный к сигналу beforeInsert, в котором значение критерия для выборки в таблицах менятся с 1 на 2. Следовательно запись исчезает из модели 1 и должна появиться в модели 2 (см. 1 пост с описанием моделей). Из модели 1 она действительно исчезает, а в модели 2 появляется только при перезапуске программы. Подключенный к сигналу dataChanged слот ситуацию не спасает:
QObject::connect(phoneModel,SIGNAL(dataChanged(QModelIndex,QModelIndex)),
                     this,SLOT(slot_refreshBackTable()));

void MainWindow::slot_refreshBackTable()
{
    //update 2nd model
    this->backModel->select();
    this->dspBackTable->update();
}


Что я делаю не так?
Гость
Какая СУБД? Возможно не происходит коммит в БД на 1 взгляд всё ок.
Tarigan
Firebird 2.5.
Коммит проходит, иначе как после перезапуска приложения данные появляются во второй модели.
Гость
dataChanged, и не должен вызываться при добавлении записи. beforeInsert - Before == Перед вставкой.
Попробуй ловить layoutChanged, и если не сработает update, делать reset.
Хотя если данные в обоих таблица одна и та же 2 sql модели это уг вэй.
Вполне достаточно повесить сверху прокси модель, и все проблемы с синхронизацией пропадут сами собой.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.