Russian Qt Forum

Qt => Базы данных => Тема начата: Paullo от Август 04, 2010, 15:04



Название: Размышления на тему QSqlTableModel и виртуальных колонок
Отправлено: Paullo от Август 04, 2010, 15:04
В программировании на Qt я новичок, присматривался давно, но ни одного полноценного проекта так и не написал.
Итак, возникли некоторые вопросы:
1. Когда использую QSqlTableModel::insertColumn() в середину таблицы происходит фигня следующего рода: таблица после вставленной колонки сдвигается на два столбца вправо, последняя колонка теряется. Вопрос в следующем - это bug или feature? Подумал что баг и даже багрепорт оформил: http://bugreports.qt.nokia.com/browse/QTBUG-12626 (http://bugreports.qt.nokia.com/browse/QTBUG-12626)
2. Соответственно хочется иметь виртуальную колонку в таблице. А ещё хочется прикрутить к этой колонке какой-нибудь скриптовый язык. Чтобы пользователь сам мог написать то что он хочет в этой виртуальной колонке видеть.

Первое что пришло в голову - использовать XmlPatterns, а в частности XQuery. Инструмент достаточно мощный, но сразу же наткнулся на проблему форматирования даты (Гугл привёл меня к функции fn:format-dateTime(), которая как я понял работает только с XSL-T версии 2.0, а XQuery её упорно не видит). Так вот - может у кого был опыт реализации подобных штук? Может использовать вместо XQuery что-нибудь другое что я упустил в связи с не очень обширным знанием Qt?


Название: Re: Размышления на тему QSqlTableModel и виртуальных колонок
Отправлено: lit-uriy от Август 04, 2010, 18:28
как-то шаблоны XML у меня ни с SQL, ни с формулами вообще не ассоциируется.

Сделать колонку в табличной модели не сложно (табличную модель писать проще чем древовидную).

Формулы можно попробовать анализировать с помощью Qt Script.


Название: Re: Размышления на тему QSqlTableModel и виртуальных колонок
Отправлено: Paullo от Август 04, 2010, 19:31
Ну на данный момент есть реализация с XQuery, которая вполне себе даже работает. Работает но не до конца из-за бага который указал под первым номером. Просто сейчас при возвращении значений из таблицы с виртуальной колонкой использую QSqlQueryModel::data() вместо QSqlTableModel::data(). Минусом является то что по сути при такой операции я получаю read only модель. Но без сдвига колонок. Можно конечно самому колонку создать, и без insertColumn, но тогда придётся у себя хранить данные Header'а и сдвиг в функции data() самому считать, что по моему тяжело и некрасиво.

А касательно XQuery - в данный момент класс работает так - существует функция создания колонки, в которую передаётся соответственно запрос XQuery и название колонки. После добавления колонки запрос прогоняется для каждого столбца, а результаты сохранятся в QHash. Запрос парсится по простому принципу - допустим запрос выглядит так: concat('Великий ', $name). Соответственно $name биндится к колонке name, если такая есть, после чего выполняется. И так для каждой строки.

QtScript, я так понимаю, имеет возможность доступа к QObject properties, на чём собственно всё и строится.
...Просто не очень в голову лезет алгоритм с помощью которого QtScript использовать можно...


Название: Re: Размышления на тему QSqlTableModel и виртуальных колонок
Отправлено: lit-uriy от Август 04, 2010, 23:02
модель свою надо делать. Можно унаследоваться от QSqlTableModel


Название: Re: Размышления на тему QSqlTableModel и виртуальных колонок
Отправлено: Paullo от Август 04, 2010, 23:33
Ну в данный момент модель своя и унаследована от QSqlTableModel :) Только вот как эту модель в QtScript использовать, да ещё так чтобы получить что-то простое и понятное для пользователя не особо с программированием знакомого?


Название: Re: Размышления на тему QSqlTableModel и виртуальных колонок
Отправлено: lit-uriy от Август 05, 2010, 00:17
где-то тут на форуме была тема посвящённая синтаксическому разбору арифметических операций.
Один из вариантов был не писать анализатор самому, а скормить формулу (существующую в виде строки) движку QtScript.
Подробностей не помню.


Название: Re: Размышления на тему QSqlTableModel и виртуальных колонок
Отправлено: Paullo от Август 05, 2010, 19:00
На всякий случай если кому понадобится:
http://www.prog.org.ru/topic_7052_0.html (http://www.prog.org.ru/topic_7052_0.html) - QtScript и разбор выражений