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

[править] Использование

[править] База данных

Создадим для экспериментов такую простенькую базу из двух отношений:

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;
}

[править] Ссылки