Russian Qt Forum

Qt => Базы данных => Тема начата: ildar от Сентябрь 01, 2009, 16:54



Название: много вьюшек для одной модели - как?
Отправлено: ildar от Сентябрь 01, 2009, 16:54
скорее всего подобный вопрос уже задавался, но ответа я не нашел

задача такая:

хочется сделать чтобы несколько table-гридов могли отображать данные одной и той же таблицы - так же как в примере tablemodel

плюс к этому хочется сделать возможность фильтрации/сортировки для каждого грида отдельно, т.е. данные одни, а представления разные

если для каждого QTableView создать собственную QSqlTableModel, то теряется возможность синхронизации изменений

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


поделитесь опытом плиз, а то изобретать велосипед нет желания


Название: Re: много вьюшек для одной модели - как?
Отправлено: Пантер от Сентябрь 01, 2009, 16:57
Можно сразу загрузить все записи через fetchMore() и навесить прокси для каждой вьюхи.


Название: Re: много вьюшек для одной модели - как?
Отправлено: ildar от Сентябрь 01, 2009, 22:17
добавил следущее после model.select()

Код:
while(model.canFetchMore())
        model.fetchMore()


но ничего не изменилось  ???


Название: Re: много вьюшек для одной модели - как?
Отправлено: Пантер от Сентябрь 02, 2009, 06:15
Прокси коннектишь до или после этого? Попробуй после.


Название: Re: много вьюшек для одной модели - как?
Отправлено: ildar от Сентябрь 02, 2009, 09:19
было до, попробовал после - не изменилось

вот кусок кода примера tablemodel который я поменял, кроме этого еще изменил коннект к базе чтобы юзать таблицу с 40k строками

Код:
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    if (!createConnection())
        return 1;

    QSqlTableModel model;

    initializeModel(&model);

    while(model.canFetchMore())
        model.fetchMore();

    QSortFilterProxyModel filterModel;
    filterModel.setSourceModel(&model);


    QTableView *view1 = createView(QObject::tr("Table Model (View 1)"), &model);
    QTableView *view2 = createView(QObject::tr("Table Model (View 2)"), &filterModel);

    view1->sortByColumn(0, Qt::AscendingOrder);
    view2->sortByColumn(0, Qt::DescendingOrder);

    view1->show();
    view2->move(view1->x() + view1->width() + 20, view1->y());
    view2->show();

    return app.exec();
}


а есть обкатанный вариант не требующий использования fetchMore? насколько я понимаю это не самое оптимальное решение в плане использования ресурсов.


Название: Re: много вьюшек для одной модели - как?
Отправлено: Пантер от Сентябрь 02, 2009, 11:29
Нужно по прокси на вьюху делать.


Название: Re: много вьюшек для одной модели - как?
Отправлено: ildar от Сентябрь 02, 2009, 11:48
уже пробовал, работает

спасибо  :)


Название: Re: много вьюшек для одной модели - как?
Отправлено: ildar от Сентябрь 02, 2009, 11:57
все равно интересно есть ли вариант без использования model.fetchMore() ?

т.е. делать выборку используя SQL WHERE/ORDER BY и синхронизируя изменения. Ведь в любом случае пользователь за один раз изменяет только одну запись и в GUI компоненте надо обновить только видимые строки. Т.о. переложить отвественность за фильтрацию на сервер БД и избавиться от необходимости пробегаться по всей таблице. Вроде бы это должно ускорить работу?!

какие есть идеи?


Название: Re: много вьюшек для одной модели - как?
Отправлено: ildar от Сентябрь 02, 2009, 12:06
при использовании QSortFilterProxyModel model.fetchMore() необходимо делать после каждого изменения?  :o


Название: Re: много вьюшек для одной модели - как?
Отправлено: Пантер от Сентябрь 02, 2009, 13:23
В таком случает только по модели на вьюху.