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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: передача данных между двумя qsqltablemodel  (Прочитано 4349 раз)
chu
Гость
« : Октябрь 31, 2010, 04:26 »

как лучше её организовать?
есть 2 таблицы: . отображаю с помощью qtableview
устанавливаю сигнал для первой:
Код:
    connect(procModel, SIGNAL(beforeUpdate(int ,QSqlRecord &)),
            this, SLOT(beforeUpdateProc(int ,QSqlRecord &)));
начал писать функцию, не знаю как закончить:
Код:
void My_Form::beforeUpdateProc(int, QSqlRecord &record)
{
    int min=(procTableView->currentIndex().sibling(0, 5)).data().toInt();
    for (int i=1; i < procModel->rowCount(); i++){
        int temp=(procTableView->currentIndex().sibling(i, 5)).data().toInt();
        if (temp<min)
            min=temp;
    }
...
}
нужно записать значение min в ячейку другой таблицы
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #1 : Октябрь 31, 2010, 19:46 »

Цитировать
virtual bool setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole )
у модели.

Ну или SQL-запрос явно.. (QSqlQuery).
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
chu
Гость
« Ответ #2 : Ноябрь 01, 2010, 17:26 »

1) дописал функцию, добавил прямой sql-запрос:
Код:
    
    int id = (procTableView->currentIndex().sibling(row, 6)).data().toInt();
    QSqlQuery query;
    query.exec(QString("update details set status = %1 where id = %2").arg(min).arg(id));

но ячейка в таблице "details" обновляется только после перезапуска диалога.
обе таблицы находятся в одном QDialog.
пробовал дописать
Код:
detModel->select
, но тогда изменение в procModel не записываются в БД

2) с setData то же самое: изменение в procModel не записываются в БД Грустный
« Последнее редактирование: Ноябрь 02, 2010, 12:51 от chu » Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #3 : Ноябрь 01, 2010, 20:15 »

Цитировать
но тогда не отображается вторая таблица
Не совсем понимаю что вы там делаете, но может у второй модели тоже select вызвать?
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
chu
Гость
« Ответ #4 : Ноябрь 01, 2010, 23:33 »

Цитировать
Не совсем понимаю что вы там делаете, но может у второй модели тоже select вызвать?
хочу обновить отображение обеих таблиц.
При вызове detModel->select, после обновления procModel,  обновляется detModel, но
почему-то при следушем измении procModel предыдущее его изменение пропадает.
пробовал вызывать select для обоих моделей. не помогло.
Думаю что, нужно найти какой-нибудь другой подход, чтоб без select... Есть такой?
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #5 : Ноябрь 02, 2010, 00:07 »

Так может поставить setEditStrategy(QSqlTableModel::OnFieldChange) у обоих моделей, чтобы все изменения сразу в базу писались..
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
chu
Гость
« Ответ #6 : Ноябрь 02, 2010, 00:38 »

Цитировать
Так может поставить setEditStrategy(QSqlTableModel::OnFieldChange) у обоих моделей, чтобы все изменения сразу в базу писались..
стоит у обеих моделей

решил задачу добавлением ещё одного сигнала и слота:
Код:
    connect(procModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
                         this, SLOT(afterUpdateProc()));

Код:
void Det_Form::afterUpdateProc()
{
    procModel->submitAll();
    detModel->select();
}
« Последнее редактирование: Ноябрь 15, 2010, 17:43 от chu » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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