Qt/FAQ/Exaro
Материал из Wiki.crossplatform.ru
Содержание |
[править] Лицензия
GNU General Public License v.3 / GNU Lesser General Public License v.3
[править] Сборка и установка
Странно, но исходники с официального сайта не собираются. Поэтому выкладываю исправленную версию exaro_2_0_0.tar.gz: exaro_2.0.0-domr.tar.gz (Исправил несколько ошибок, не позволяющих собрать и добавил возможность задавать состояние окна предпросмотра (minimize, maximize, fullscreen, etc).
Зависимости
ВАЖНО: некоторые из этих пакетов могут собираться как с помощью qmake, так и с помощью cmake. После сборки с qmake, не хватало каких-то файлов. Каких — сейчас не помню. Так что собирайте их все с cmake, будет меньше проблем
[править] Сборка под Linux
- собрать и установить зависимости
- $ tar xvf exaro_2.0.0-domr.tar.gz
- $ mkdir exaro-build
- $ cd exaro-build
- $ cmake -DCMAKE_INSTALL_PREFIX=/usr ../exaro_2.0.0-domr/
- $ make
- # make install
[править] Сборка под Windows
[править] Бинарные пакеты
Debian i386
- exaro_2.0.0-domr_i386.deb
- propertyeditor_20110125-1_i386.deb
- zint_20110126-1_i386.deb
- quazip_20110126-1_i386.deb
[править] Использование
[править] База данных
Создадим для экспериментов такую простенькую базу из двух отношений:
CREATE TABLE city ( id int PRIMARY KEY, title varchar(32) ) CREATE TABLE person ( id int PRIMARY KEY, name varchar(32), city int REFERENCES city(id) )
[править] Визуальный редактор
Интерфейс редактора похож на интерфейс Qt Designer — слева располагается палитра компонентов, справа редактор свойств. Внизу имеется редактор SQL-запросов, редактор форм и инспектор объектов.
Создание отчёта можно доверить мастеру — File->New Report, но ради обучения лучше создать отчёт вручную.
[править] Шаг 1. Настройка БД
Menu->Report->Setup a database
Вводим свои данные, нажимаем ОК.
[править] Шаг 2. Создание запроса
В окне Query Editor создаём новый запрос, даём ему имя, пишем сам запрос, сохраняем. Там же запрос можно протестировать, нажав на соответствующую кнопку.
Для примера, создадим запрос с именем allpersons, показывающий всех людей и их города:
SELECT person.id, person.name, city.title FROM person, city WHERE person.city = city.id
Удостоверившись, что запрос работает корректно, сохраняем его.
[править] Шаг 3. Создание страницы
Menu->Report->New page
Теперь на страницу можно добавлять необходимые компоненты.
ВАЖНО: Текст, поля, скрипты, штрих-коды, в общем, любые компоненты можно добавлять только в контейнеры (Bands). На пустую страницу они не лягут, даже не пытайтесь! =)
- Добавляем контейнер заголовок (Bands->title)
- Добавляем текст в заголовок (Text->text). С помощью Редактора свойств устанавливаем необходимые параметры
- Добавляем контейнер DetailContainer. Он служит для отображения результатов запроса. В его свойствах необходимо установить имя запроса. В нашем случаем, allpersons.
- В контейнер DetailCantainer добавляем контейнер DetailHeader. В него мы введём заголовок будущей таблицы
- C помощью компонентов text формируем заголовок таблицы. Выравниваем размеры контейнера.
- В контейнер DetailCantainer добавляем контейнер Detail. Сюда мы добавляем компоненты Text->field. В свойствах каждого из них устанавливаем параметры queryName и fieldName. Именно в этом контейнеры выполняется итерация по кортежам результата запроса. (Но мы можем вручную обрабатывать результаты с помощью скриптов, но о них ниже)
- Теперь почти всё готово, осталось только выполнить наш запрос. Для этого открываем редактор скрипта (Menu->Report->Edit script) и пишем туда allpersons.exec();
- Сохраняем скрипт. Сохраняем отчёт. Нажимаем F9. Если всё было сделано правильно, перед Вами появится предпросмотр отчёта с данными из запроса.
[править] Скрипты
eXaro использует QtScript, а это значит, что пользователь имеет доступ почти ко всей мощи Qt.
При запуске отчёта выполняется главный скрипт, который можно отредактировать в дизайнере с помощью Menu->Report->Edit script или из своей программы установить функцией Report::ReportInterface::setScript(const QString & script)
Пример
Представим, что нам необходимо распечатать информацию об одном человеке. Совершенно излишне для этого создавать DetailContainer, настраивать множество параметров и т.д. Гораздо проще вручную выполнить запрос, извлечь необходимые данные и вывести их на страницу.
Поэтому создаём новый отчёт, создаём запрос (oneperson), например:
SELECT person.id, person.name, city.title FROM person, city, WHERE person.city = city.id AND person.id = 1;
Здесь мы жёстко указываем условие выборки "person.id = 1" для тестирование отчёта. После того, как мы отладим отчёт, мы создадим нужный запрос с нужными параметрами в своей программе и передадим его eXaro с помощью функции Report::ReportInterface::setQueries(QVariantMap queries).
Теперь редактируем главный скрипт:
oneperson.exec(); oneperson.first();
var persId = oneperson.value("id"); var persName = oneperson.value("name"); var persCity = oneperson.value("city");
Теперь вся необходимая информация о человеке доступна в соответствующих переменных, и нам остаётся только вывести её на страницу.
Для этого добавляем на страницу самый просто контейнер title, а на него компоненты Script. В свойстве "script" каждого из них вписываем имя соответствующей переменной (persId, persNeme, etc)
Возможно, понадобится добавить на страницу дату отчёта. Нет ничего проще:
var date = new Date(); var currentDate = date.getDate() + '.' + date.getMonth()+1 + '.' + date.getFullYear();
Так как QtScript - это полноценный ECMAscript с возможностями Qt, ваша фантазия по созданию отчётов ничем не ограничена. :)
[править] Встраивание в своё приложение
Предположим, что eXaro удачно собран и установлен.
Файл проекта должен выглядеть примерно так:
QT += core \ gui \ sql \ xml \ script CONFIG += uitools LIBS += -lReport
SOURCES += main.cpp
main.cpp
#include <QApplication> #include <QSqlDatabase> #include <QDebug> #include <QMap> #include <reportengine.h> int main(int argc, char* argv[]) { if (argc != 2) { qDebug() << "usage: app personID"; return 1; } QApplication app(argc, argv); QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("persons.db"); if (!db.open()) { qDebug() << "Can't open a database"; return 1; } Report::ReportInterface* report = 0; Report::ReportEngine reportEngine; report = reportEngine.loadReport("oneperson.bdrt"); if (!report) { qDebug() << "Can't open report file"; return 1; } report->setDatabase(db); int personId = QString(argv[1]).toInt(); QString query(QString("SELECT person.id, person.name, city.title " " FROM person, city " " WHERE person.city = city.id and person.id = %1").arg(personId)); QVariantMap queries; queries["oneperson"] = query; report->setQueries(queries); report->setShowExitConfirm(false); report->setShowSplashScreen(true); if (!report->exec()) { qDebug() << "Can't exec the report"; delete report; return 1; } delete report; return 0; }