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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сортировка в QDataTable  (Прочитано 4711 раз)
firix
Гость
« : Октябрь 12, 2006, 10:31 »

Мне нужно, чтобы в QDataTable заносились данные из 2 связанных таблиц, и чтобы работала сортировка по щелчку на заголовках столбцов. Связывал QDataTable с QSqlSelectCursor - выводится все правильно, но сортировки нет. Писал наследника QSqlCursor, переопределяя calculateFields() для полей из второй таблицы, - выводилась ошибка:

QODBC3: Unable to execute statement
[Microsoft][Драйвер ODBC Microsoft Access] Слишком мало параметров. Требуется 1.

Кто что может подсказать по этой проблеме?
Записан
MaxWin
Гость
« Ответ #1 : Октябрь 12, 2006, 16:01 »

Посмотри исходники QSqlSelectCursor сразу все станет на свои места.
Я вообще переписал его под себя добавив необходимые фичи.
Записан
firix
Гость
« Ответ #2 : Октябрь 12, 2006, 21:50 »

Посмотрел исходники QSqlSelectCursor, все на свои места не встало. Вижу, что в нем методы типа setSort() и sort(), которые вроде и отвечают за сортировку, реализованы как простые заглушки. Пытаюсь переопределить их, чтобы они переадресовывались к соответствующим методам QSqlCursor, но никакого эффекта не дает. Подскажите чего-нибудь поконкретнее, в какую сторону смотреть?
Записан
MaxWin
Гость
« Ответ #3 : Октябрь 14, 2006, 12:52 »

Я почему собственно и говорил посмотреть исходники. Дело вовсе не в том, что там заглушки на sort и setSort.  Смотреть надо сюда.
bool QSqlSelectCursor::select( const QString&, const QSqlIndex& )
{
    bool ret = QSqlCursor::exec( d->query );
    if ( ret && !d->populated )
   populateCursor();
    return ret;
}

Берется SQL скармливается напрямую exec, далее по выборке читаются и все.
Нет сдесь никакой сортировки кроме той которую укажеш в SQL как order by.

Выхода 2. Либо береш на себя управление заголовками грида, готовиш правильный SQL и кормиш его select  либо переписываеш select c возможностью сортировки как например сделано QSqlCursor.

Надеюсь доходчиво объяснил.
Записан
firix
Гость
« Ответ #4 : Октябрь 15, 2006, 11:14 »

Ага. Теперь более-менее понятно стало. Стал делать вторым способом - переписал метод select примерно так:

Код:
bool QSqlSelectCursor::select(const QString& filter, const QSqlIndex& sort)
{
if (sort.count() > 0)
{
QString query = d->query;
int pos = query.find("ORDER BY ", 0, false);
if (pos == -1)
query.replace(";", " ");
else
query = query.left(pos);
query += "ORDER BY " + sort.toString();
d->query = query;
}

    bool ret = QSqlCursor::exec( d->query );
    if ( ret && !d->populated )
populateCursor();
    return ret;
}


Но тут возникла еще одна интересная проблемка. При клике на заголовках грида происходит сортировка по возрастанию (все вроде как надо), но при повторном клике на том же заголовке происходит опять сортировка по возрастанию, хотя по идее должна чередоваться сортировка по возрастанию и убыванию.
Поковырявшись, решил ради интереса в проект засунуть "двойника" класса QSqlCursor, с другим именем, но с той же реализацией, чтобы дебаггером пройтись, посмотреть, как там чего изнутри. В общем, с этим "двойником" та же история - сортировка только по возрастанию.
Не связано ли это как-нибудь с классом QSqlCursorManager, т.к. клики по заголовкам приводят к вызову его методов?

добавлено спустя 11 часов 15 минут:

 Все, решил эту проблему. Тут-то и пригодились те самые setSort() и sort(). Вроде теперь все работает как надо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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