crossplatform.ru

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

> Обновление отображения базы в QTableView
eXeLe
  опции профиля:
сообщение 24.8.2012, 12:26
Сообщение #1


Новичок


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

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




Репутация:   0  


собссно возник вопрос.
работаю с базой через запросы
QSqlQuery query;
...

параллельно надо иногда просматривать содержимое базы. вызываю окошко через QSqlTableModel - QTableView, где она отображается.
но все измнения, вносимые через запросы, отображаются только после перезапуска программы.
как исправить?

смотрел в сторону QDataWidgetMapper, но как я понял, оно просто дает работать с тем или иным полем таблицы, а у меня идут запросы в стиле "для строки с таким то имненем, увеличить показатель value на x" или банально добавление новых строк.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
FantasyOr
  опции профиля:
сообщение 14.12.2012, 8:54
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 75
Регистрация: 13.8.2010
Пользователь №: 1956

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




Репутация:   0  


У меня получился такой нехитрый код
Раскрывающийся текст

/// Внимание это нужно делать прежде чем вносить изменения в таблицу: устанавливать фильтр и сортировку, иначе не работает, currentIndex возвращает (-1, -1)

QModelIndex mi = view->currentIndex();    //  запоминаем индекс выделенной ячейки
int sbVal = view->verticalScrollBar()->value();    //  запоминаем значение скрола - это последняя видимая строка
int sub = sbVal - mi.row();            //  разница между послед видимой строкой и выделенной, для восстановления визуального состояния

// запоминаем ID записи, чтоб найти нужную строку
QString _ID = model->data(model->index(mi.row(), idx_ID)).toString();

// устанавливаем фильтр и сортировку
model->setFilter(_sqlWhere);
if (!orderColumn.isEmpty())
{    model->sort(model->fieldIndex(orderColumn), Qt::AscendingOrder);    }

// делаем выборку всех записей - у меня около 300 записей обновляется каждые 10 секунд вроде бы без тормозов
model->select();
while (model->canFetchMore())
{    model->fetchMore();    }

// надеемся, что не было изменений приведших у изменению позиции у выделенной записи - не было добавлений и удаления перед записью или их было одинаковое ко-во
if ((model->data(model->index(mi.row(), idx_ID)).toString() != _ID))
{
    // не повезло
    int idx = 0;
    bool notFount = true;

    // идём сверху вниз пока не найдём нужную запись или не просмотрим все записи        
    while (notFount && idx < model->rowCount())    
    {    
        if (model->data(model->index(idx, idx_ID)).toString() == _ID) &&
        {    notFount = false;    }
        else
        {    ++idx;    }
    }

    // если не нашли, то оставляем скролл на том же месте
    if (notFount)
    {    mi = model->index(sbVal-sub, mi.column());    }
    else
    {    mi = model->index(idx, mi.column());    }      
}

// выделяем ячейку, скролируем таблицу
view->setCurrentIndex(mi);
view->verticalScrollBar()->setValue(mi.row()+sub);



прошу оценить подход, может что посоветуете.
Спасибо.

Сообщение отредактировал FantasyOr - 20.12.2012, 15:17
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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




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