LimeReport Forum
General Category | Основное => Discussion | Обсуждение => Topic started by: rust on November 01, 2016, 10:39:03 pm
-
Доброго времени суток.
Направьте на путь верный ответив на вопросы.
1. Сборка
qmake
mingw-32-make
mingw-32-make install
этого достаточно?
2. Как подключить LimeReport к уже существующему проекту.
3. Как передать значение 2-5 переменных из основного проекта в отчет (переменные берутся из разных баз и разных таблиц) как это осуществить не создавая модель. Заполняется печатная форма.
Если возможно исходники простых примеров посмотреть.
Например заполнили несколько QLineEdit, выбрали значение в QComboBox и вывели это в отчет.
Спасибо.
-
Доброго времени !
Проще всего, для начала изучения, открыть limereport.pro в QtCreator
в этом проекте, помимо самого LimeReport, так же содержатся простые примеры использования LimeReport (demo_r1, demo_r2).
В demo_r1 показано подключение LimeReport и передача значений в отчет.
Если останутся вопросы постараюсь ответить.
-
1. Да, достаточно, тебе для проекта нужны заголовочные файлы (после сборки ищи в build/версия qt/операционка/release/lib/include), сами lib'ы b dll'ки
2. В файле проекта зацепи lib файлы, типа
LIBS += -Lпуть к limereport.a -lliblimereport
Также в INCLUDEPATH добавь путь поиска заголовочных файлов, типа
INCLUDEPATH += путь к limereport/include
3. Значения передаются с помощью setReportVariable
т.е. код вроде такого
LimeReport::ReportEngine *m_report=new LimeReport::ReportEngine(this);
m_report->dataManager()->setReportVariable("имя",значение);
-
а, да... ну и убедись в том, что динамическая библиотека видима программой, либо рядом лежит либо в путях прописана
-
Спасибо. Направление понял.
Попробую сделать минимальный проект.
-
Ну вот из pro файла моего кусок кода
LIMEREPORT_LIB_NAME = limereport
ZINT_LIB_NAME = QtZint
LIMEREPORT_DIR = $$[QT_INSTALL_PREFIX]/../LimeReport
LIMEREPORT_LIBRARY_DIR = $$LIMEREPORT_DIR/lib
INCLUDEPATH += $$LIMEREPORT_DIR/include
LIMEREPORT_LIB_FILE = -L$$LIMEREPORT_LIBRARY_DIR -l$${LIMEREPORT_LIB_NAME}
ZINT_LIB_FILE = -L$$LIMEREPORT_LIBRARY_DIR -l$${ZINT_LIB_NAME}
LIBS += $$LIMEREPORT_LIB_FILE
LIBS += $$ZINT_LIB_FILE
LimeReport лежит в папке с QT/LimeReport
dll я либо кидаю тудаже где исполняшка линкуется, либо прямо в qt/qtbase/bin, а он прописывается в переменной PATH. (точнее, у меня не совсем так, у меня для сборки переменные прописываются, но суть таже, dll видны должны быть исполняемому файлу)
-
Как раз с путями разбирался.
Кучу времени с экономил с этим постом.
"Привет Мир" из диалога в отчет передал :-)
Спасибо за ваш проект и помощь.
ЗЫ Возможно если бы часть этой ветки была где нибудь в readme.txt поклонников LimeReport было бы больше.
-
Отчет это 2-х страничный бланк.
Может я не там ищу, но как добавить 2-ю страницу к отчету?
-
В toolBar значок с плюсиком :)
[вложение удалено администратором]
-
Видимо у меня не та версия.
1.3.11
Вопрос, где взять свежее? :-)
[вложение удалено администратором]
-
на гитхабе исходники, там же рядом в другой ветке
https://github.com/fralx/LimeReport/tree/1.4
-
У меня изображение храниться в базе QByteArray. Подскажите как вывести в отчет.
-
Обсуждался уже подобный вопрос. Тут.
http://limereport.ru/forum/index.php?topic=161.0
а именно
"Как вариант можно написать CallbackDatasource"
Хотя в твоем случае картинка должна подхватываться из базы. Определи для элемента imageItem DataSource и field, посмотри что получится
-
Добавил на форму imageItem. Добавил DataSource (select * from image) а в поле field что добавлять?
-
название поля из таблицы, в котором картинка хранится
-
В поле field прописал имя столбца, но картинка так и не появилась.
-
Если база данных в sqlite, зашлите мне я гляну.
-
База MySQL.
-
Вот БД
-
Воспроизвести проблему не удалось. Можно еще шаблон отчета ?
-
У вас Все нормально выводится?
-
Я заново добавил таблицу и все заработало.
-
Таблица image была добавлена как подзапрос поэтому и не работало
-
Добрый день.
Подскажите пожалуйста, можно ли по значению "Report variable" с помощью скрипта в отчете, от рендерить только ту страницу которая нужна? Например: If var1 == 2 {RenderReport = page2};
Чтобы не создавая кучу файлов отчётов, менять вид отчёта.
-
На данный момент нет. Но я подумаю над этим.
-
Алекс, как вариант через скрипты какие-то данные делать пустыми. Если автовысота итемов и бандов будет, то они не станут рендериться. Костыль, но задачу решает вроде
-
Добрый день!
Возможно ли напечатать конкретную страницу или диапазон из всего отчёта?
Как я понимаю,
printer.setPrintRange(QPrinter::PageRange);
printer.setFromTo(0,0);
не помогает.
-
Из предварительного просмотра при выборе принтера можно указать диапазон.
Можно приделать другие варианты.
-
Abygor Пофиксил теперь можно в через принтер диапазон передать.
Единственно страницы у меня с 1 начинаются.
-
И снова доброго времени суток.
В отчете необходимо печатать каждый символ строки переданной из БД в отдельном квадратике.
См. вложение.
если бы это было одно поле то не вопрос, но таких полей более 20.
Можно ли это делать средствами LR? Если да то в какую сторону копать.
Спасибо.
-
Примерно так... Каждый квадратик - техтИтем, содержимое ниже
$S{
var text=$D{таблица.поле}.toString();
text.substring(2,1);
}
-
Спасибо. Из базы все ок. А вот тут что не так?
$S{
var text =$V{modemNumber}.toString();
text.charAt(0);
}
SyntaxError: Parse error
-
Вот так будет работать :)
$S{
var text =$V{modemNumber};
text.toString().charAt(0);
}
-
запутался напрочь в синтаксисе :-(
$S{
var text=$V{modemNumber};
var ch;
if(text.toString()!=""){
ch=text.toString().charAt(0);
}
else {
ch=" ";
}
ch;
}
Естественно не работает :-)
ЗЫ: пару бы примеров посмотреть на использование условий циклов и работу со строками, а то как слепой котенок бьюсь над элементарными вещами.
-
LimeReport использует синтаксис javascript, соответственно примеры доступны :)
Я так понимаю у вас при пустом значении ошибка вылетает ?
В этом случае ваш скрипт нужно поправить следующим образом :
$S{
var text="$V{modemNumber}";
var ch;
if(text.toString()!=""){
ch=text.toString().charAt(0);
}
else {
ch=" ";
}
ch;
}
-
Многоуважаемые форумчане!
Я используя ОС Ubuntu (amd64) и мне необходимо установить LimeReport для учебных целей. Прошу, опишите процесс установки данной программы под вышеупомянутую операционную систему, ибо установить своими силами у меня не получается. Прошу, подскажите.
Заранее благодарен.
-
LimeReport, по большей части, библиотека для приложений на qt и по сути в установке не нуждается. Процесс подключения библиотеки к проекту уже обсуждался на форуме http://limereport.ru/forum/index.php?topic=137.0 (http://limereport.ru/forum/index.php?topic=137.0). А если нужно, просто запустить дизайнер отчетов, то можно скачать appimage дизайнера https://sourceforge.net/projects/limereport/files/Linux/LRDesigner_1_4_7-64bit.AppImage/download (https://sourceforge.net/projects/limereport/files/Linux/LRDesigner_1_4_7-64bit.AppImage/download) и запускать его без установки.
-
Добрый день.
Спасибо за ваш продукт, очень понравился.
Вопросик новичка - где найти примеры\описание как использовать скрипты ? Вижу закладки, связанные со скриптами в редакторе отчетов, но не знаю как использовать.
Еще вопрос - в просмотре документа есть возможность отредактировать поля. Можно ли как то сохранять некоторые новые значения для использования в следующем документе ? Сохранить в шаблоне или в дополнительном ini файле. Например внизу документа подпись - пользователь редактирует ее один раз и печатает необходимое количество документов.
-
Приветствую!
Документации к скриптам на данный момент не существует в силу отсутствия достаточного количества времени на её написание.
Вкратце могу сказать:
1. Синтаксис скриптов javascript
2. Скрипты доступны непосредственно при формировании вывода в TextItem, а также есть инициализационный скрипт, который выполняется перед генерацией отчета. Для выполнения скрипта в текстовом элементе используется конструкция $S{ Скрипт }. Если посмотреть демо примеры, то можно найти довольно много примеров такого использования скриптов. В инициализационном скрипте можно определить служебные функции, которые потом будут доступны при генерации текстовых элементов. Так же в этом скрипте можно вызвать диалоговое окно, в котором можно установить некоторые переменные отчета для дальнейшего использования во время генерации. В следующей версии (1.5) в инициализационном скрипте также можно будет определить функции, которые будут слотами для событий происходящих во время генерации отчета (beforeRender, afterData, afterRender).
Что касается возможности использования данных несколькими отчетами, то могу предложить переменные в качестве связующего звена.
-
Здравствуйте!
Подскажите, есть ли возможность печати 2-х страниц на одном листе? Просто хотелось бы сделать стандартный документ формата А4 книжной ориентации и при необходимости печатать его либо как есть, либо впихнуть его на одну альбомную страничку в двух экземплярах.
-
К сожалению так не получится :( Одну страницу на два листа можно, а две страницы на один лист нет.
-
Жаль. Не всегда есть возможность сделать это через настройки принтера. Да и неудобно при каждой печати тыкать. В программе выставил и забыл - мухи отдельно, котлеты отдельно. Видимо придется для каждого варианта разные файлы создавать.
-
Здравствуйте, подскажите, как можно решить такую проблему?
Имеется текстовое поле, в котором размещен текст:
"Дата рождения: $D{owner.ДатаРождения}
Проблема в том, что даты или места может не быть, поэтому необходимо при получении $D{owner....} проверять, не пустое ли оно и выводить или не выводить его и вспомогательный текст в начале.
Насколько я понимаю, это можно сделать скриптом, что-то вроде:
if (getField('$D{owners.ДатаРождения}')<>"")
{
"Дата рождения:" $D{owners.ДатаРождения},
}
адрес: $D{owners.АДРЕС}
Как это правильно оформить?
-
в тексте поля примерно так
$S{
if ($D{table.field}=="")
"";
else
$D{table.field};
}
-
В приведенном скрипте если поле пустое, то и в случае печати оно большой погоды не сделает.
Может вопрос не совсем корректно задал.
Сейчас есть таблица, составленная из текстовых полей с границами, объединенных построчно в layout-ы. В этой таблице есть ячейка-текстовое поле, в которой есть 2 строки:
"Дата рождения: $D{...}
Город: $D{...}"
Т.е. если поля будут возвращены пустые, то нужно убрать соответствующие фразы.
Если все поля будут пустые, то все фразы уберутся, но ячейка (исходное текстовое поле) должно остаться.
Параллельно возникли вопросы по текстовым полям:
1. На что и как влияют свойства:
- followTo;
- format;
- textIndent?
2. Текстовое поле имеет размер? Вложил в него текста примерно на страницу Word шрифтом Times New Roman, size 12. Вставилось все, но даже в предварительном просмотре выводится не весь текст. Бэнда, страницы хватает, включены свойства AutoHeight и MaxWordLength.
3. На бэнде размещено 3 текстовых поля по ширине бэнда друг над другом (в каждой содержится часть текста, т.к. в 1 поле все не отображается). Свойство allowHTML включено, в каждом блоке текста идет:
<style>
p { text-indent: 100px; }
</style>
<p>текст</p>
...
<p>текст</p>
Проблема в том, что в первом блоке абзацы отрабатывают, а последующих либо нет, либо на печать выводится часть текста, обрезанная сверху и снизу, либо появляются промежуточные пустые страницы.
Я неправильно использую теги или в чем может быть дело?
-
по примеру перефразирую, что вобщем-то очевидно:
$S{
if ($D{table.field}=="") // если поле пустое ничего не выводим
"";
else
"Произвольный текст:"+$D{table.field}; // в противном случае выводим, все что угодно в соответсвии с синтаксисом ECMA 262
}
followTo - следует за, указать текстовое поле, в котором начало фразы, в текущем будет продолжение. Полезно использовать, например при обтекании рисунка текстом
format - формат отображения текста, нужно использовать вместе с dataType свойством
textIdent - очевидно, отступ текста от границы поля
по HTML не вполне понял вопрос, но почему бы не использовать свойство autoHeight?
-
Спасибо, со скриптом именно то, что нужно, что-то зациклился я на фигурных после if, поэтому не парсилось.
По HTML приложил файлы, в каждом абзацы отмечены соответствующими тегами:
- test1 - в бэнд помещены три текстовых поля (длинный текст, разбитый на 3 части), в каждом установлен стиль для абзаца - на PDF предпросмотра видно, что абзацы не работают;
- test2 - эти же три текстовых поля, стиль для абзаца установлен только в первом - на PDF предпросмотра видно, что абзацы не работают;
- test3 - эти же три текстовых поля, стиль для абзаца не установлен - на PDF предпросмотра видно, что абзацы не работают;
- test4 - скопировал текстовый блок из другого отчета, где абзацы работали. Размножил его до трех. Вставил тот же текст. В каждом блоке поместил стиль для абзаца - абзацы на предпросмотре есть.
Еще большая проблема - во всех PDF предпросмотра видно, что есть проблемы с выводом текста (странные переносы на новую строку, пропажа части абзаца). В этих блоках нет данных, но если добавить поля из модели, то сдвиги будут еще сильнее. Положение сдвигов меняется от манипуляций с тегами, что наводит на мысль, что проблема может быть в оформлении текста. При отключении тегов весь текст попадает в просмотр, но встает вопрос, как сделать абзацы. Отключал trimValue, делал пробелами - в самом дизайнере абзацы появляются, но уже в предпросмотре первого абзаца в блоке текста нет, а остальные разные (из-за равнения по ширине страницы).
Собственно цели преследуются следующие:
1. напечатать непрерывный, около 3-4 страниц текст, в которое вставляются несколько полей из программы;
2. должно соблюдаться форматирование: абзацы, некоторые строки с равнением по центру страницы, пустые строки между некоторыми абзацами, 1-2 таблицы (составлял из текстовых блоков с границами), если таблица расширяемая, то шапка в бэнде, тело в саббенде.
Буду признателен за любую помощь.
-
Проблема с переходом на новую страницу, когда DataBand занимает больше одной страницы единолично.
Это вопрос Алексу.
Вот тут подробней можно?
...в которое вставляются несколько полей из программы...
каким образом всавляются?
-
Вот тут подробней можно?
...в которое вставляются несколько полей из программы...
каким образом всавляются?
Идет текстовый блок в бэнде, в нем встречаются $D{имя_модели.имя_поля} - с самой вставкой значений проблем не заметил.
Приложил еще один пример, где хорошо видно проблему - также бэнд с 3-мя блоками (я их пронумеровал, часть обвел рамкой, чтобы легче было их распознать). Применено одинаковое оформление HTML-тэгами. В порядке 1-2-3 второй блок, который переносится на следующую страницу, выводится в виде хаоса.
Если поменять местами блоки 2 и 3 местами в бэнде, то на следующую страницу переносится 3-й блок. При печати уже он выводится кусками с разрывами, а 2-й блок печатается нормально.
Если отключить HTML во всех блоках, то отображение и перенос всех блоков на предпечати вроде бы нормальный (последняя строка переносимого блока слегка залазит в нижнее поле первой страницы, но этот момент я подробно не проверял).
Если отключить HTML теги только в переносимом блоке, то он печатается лучше (нет разрывов), но часть все равно не печатается.
Похоже, что когда в бэнде есть блоки текста с HTML тэгами, идет сдвиг при расчете параметров текста для печати, плюс на это влияет фактическая длина вставляемых данных.
Вроде разобрался с первоначальным вопросом по абзацам (почему то работают, то нет) - свойство allowHTML не всегда срабатывает, если теги или текст добавлять после того, как она стоит. После добавления тегов или исправлений в блоке текста выкл/вкл галку и отображение в дизайнере и печати подхватывает форматирование.
-
Вроде разобрался с первоначальным вопросом по абзацам (почему то работают, то нет) - свойство allowHTML не всегда срабатывает, если теги или текст добавлять после того, как она стоит. После добавления тегов или исправлений в блоке текста выкл/вкл галку и отображение в дизайнере и печати подхватывает форматирование.
Видимо, поэтому я и не заметил описаной проблемы.
Про последний итем и мусор: я это заметил, об этом и писал.Более того, это может быть и единственный итем на странице. И необязательно с allowHTML.
Я написал Алексу в личку и выслал упрощенный пример. Ждем.
-
Проблему увидел. Буду разбираться.
-
Поправил разбиение TextItem. Пушнул на github.
-
Еще раз поправил :) И пушнул
-
Спасибо! Попробуем.
-
Парни, привет.
Возникла такая проблема, решил использовать LR Designer и пытаюсь подключиться к своей базе MariaDB, но когда выбираю драйвер - qmysql3, ловлю краш.
Windows 10 x64. База доступна для внешних соединений.
В какую сторону смотреть?
-
Из программы нормально цепляется?
-
Можно более подробно? Валится в какой момент? Какое сообщение?
-
Попробовал DBeaver, соединение ловлю, базу вижу.
Захожу в LRDesigner, указываю данные для соединения (пробовал и без порта), нажимаю Check Connection - ловлю краш.
Если использую драйвер - qsqlite, получаю пустое сообщение об ошибке.
Скрины приложил.
-
Ну Sqlite - это сильно, думаю :)
Все таки MariaDB более совместима с MySQL. Какая версия? Там кажется ситуация была следующая - MariaDB и MySQL версии 5.5 полностью совместимы. Потом идут разногласия. Дрова как собираешь для MariaDB?
-
10.1.26-MariaDB-0+deb9u1 - Debian 9.1 - версия БД
А дрова...
Если честно, я даже не понял о чем речь, как, куда и под что их собирать :o
Ткните, будьте добры, в нужном направлении :)
-
версия 10 - это позже 5.5, именно число 10 говорит о неполной совместимости с MySQL.
Дрова.. я про драйвер MySQL для QT. В Assistant статья SQL Database Drivers.
Или ты не собирал сам драйвер, а использовал из репозиотрия? Собственно, этот момент и важен, собирал сам или нет, если собирал, то как, если не собирал, то какой используешь.
-
Драйверов я не собирал. В корне ПО была папка sqldrivers и там уже лежит qsqlmysql.dll.
Я посчитал, что он сгодится.
-
Понятно. Это драйвер собран явно конкретно под MySql. В силу уже указанных причин он, возможно, не подходит в полной мере для MariaDB версии 10.
ПО хорошему надо собрать драйвер именно под Maria.
Аналогичная ситуация возникает при использовании InterBase и/или FireBird
-
Хорошо, углублюсь в эту тему. Попробую собрать драйвер. ::)
Подскажите только, вот - http://joelwilkins.blogspot.ru/2013/11/building-mariadb-driver-for-qt-v52-beta.html . Эта статейка, то что мне нужно?
-
Версия QT какая?
Я так понял, что ставил уже готовый тулкит QT? ТОгда тебе исходники понадобятся, если их нету.
Вообще ничего сложного нету, по указанной ссылке все в тему, но несколько усложенно.
Суть - читай про сборку MySql, но при сборке инклюды и либы нужны те, что с MariaDB.
Я не уверен в успехе, я не собирал. Говорю по аналогии с FireBird, его я собирал. Принцип должен быть один и тот же.
-
Хорошо, спасибо. Отпишусь о результатах)
-
Собрал драйвер, закинул в папку /limereport/sqldrivers .
Получаю ошибку - Driver not loaded.
Собственно, как его и куда загружать?
-
Закинуть надо туда, где у тебя лежал ранее драйвер default'ный
> Драйверов я не собирал. В корне ПО была папка sqldrivers и там уже лежит qsqlmysql.dll.
сюда пробуй. Старый бэкапни куда-нить на всякий случай. И не забудь, рядом с исполняшкой положить dll клиентовскую от MariaDB
-
Клиентовская .dll имеешь ввиду...
-
угу
-
Подложил, заменил - результат тот же. Driver not loaded :-\
-
Собирал как плугин?
Давай попробуем сначала по порядку
-
Действовал в соответствии с инструкцией, размещенной по ссылке выше.
Вопросов до 10 шага не возникало.
Вот такой код получился:
TARGET = qsqlmysql
SOURCES = main.cpp
OTHER_FILES += mysql.json
include(../../../sql/drivers/mysql/qsql_mysql.pri)
PLUGIN_CLASS_NAME = QMYSQLDriverPlugin
include(../qsqldriverbase.pri)
win32: LIBS += -L"$$PWD/'../../../../../../../../MariaDB 10.1/lib/'" -llibmysql
INCLUDEPATH += "$$PWD/'../../../../../../../../MariaDB 10.1/include/mysql'"
DEPENDPATH += "$$PWD/'../../../../../../../../MariaDB 10.1/include/mysql'"
win32:!win32-g++: PRE_TARGETDEPS += "$$PWD/'../../../../../../../../MariaDB 10.1/lib/libmysql.lib'"
#else:win32-g++: PRE_TARGETDEPS += "$$PWD/'../../../../../../../../MariaDB 10.1/lib/liblibmysql.a'"
Последнюю строчку я закомментировал лично, т.к этой строчки не было в том гайде и с этой строчкой проект не хотел собираться, выдавая ошибку:
:-1: ошибка: No rule to make target 'D:/Qt52/5.2.0/Src/qtbase/src/plugins/sqldrivers/mysql/'../../../../../../../../MariaDB 10.1/lib/liblibmysql.a'', needed by '\plugins\sqldrivers\qsqlmysql.dll'. Stop.
Найдя свежеиспеченный драйвер, подложив его в /limereport/sqldrivers и подложив клиентскую библиотеку, получаю driver not loaded.
-
где лежит исполняемый файл, где плугин? Ты запускаешь LRDesigner из приложения?
В какой момент говорит Driver Not Loaded?
-
Запускаю LRDesigner как самостоятельную программу.
Driver not loaded говорит в момент когда пытаешься установить соединение с базой.
Check connection или когда пытаешься установить соединение с ней.
Прилагаю скрины
P.S Вот тут есть какие-то MariaDB Коннекторы - https://mariadb.com/kb/en/library/connectors/ . Это вообще к чему и почему? :o
-
Попробуй сначала накидать софтинку элементарную, законектиться оттуда к базе
-
Хихихи. Это надолго.
Яжнепрограммист.
Хорошо, отпишусь о результатах.
-
т.е. ты не программист, собираешь драйвер БД, но написать че-нить что коннектит этот драйвер, не могешь... :D Срыв шаблона :D
-
Давай еще с другой стороны зайдем... я не вижу, лежит ли рядом Qt5Sql.dll
-
Вот он.
А по статейкам действовать не мудрено :)
Примерно получается вот такой код...
static bool createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLMYSQL");
db.setDatabaseName("zabbix");
db.setUserName("ralfaruh");
db.setHostName("192.168.50.107:3306");
db.setPassword("password");
if (!db.open()) {
qDebug() << "Cannot open database:" << db.lastError();
return false;
}
return true;
}
-
что пишет по qDebug() ?
-
Итак, есть успех.
Нужно было клиентскую .dll от MariaDB закинуть в C:/Windows. (Если убрать оттуда эту .dll, прога будет так же ругаться Driver Not Loaded).
Закинул собранные драйвера в D:\Qt52\5.2.0\mingw48_32\plugins\sqldrivers и словил соединение с базой.
Из LimeReportDesigner все так же Driver Not Loaded.
Прилагаю скрин, что соединение с базой есть (соединение безуспешное из за неправильного пароля. Используя валидный получаем успешное соединение)
-
> Нужно было клиентскую .dll от MariaDB закинуть в C:/Windows
Достаточно ее положить рядом с экзешником. Если этого мало, это уже не хорошо. Возможно в переменной path окружения прописан путь к какой-то другой клиентской библиотеке или в c:/windows была другая библиотека?
Запустиить LRDesigner из программы для тебя проблема, я так понимаю?
Или попробуешь?
-
В C:/Windows не было этой библиотеки вовсе. Я подсмотрел это здесь - http://seppemagiels.com/blog/create-mysql-driver-qt5-windows.
Сейчас покурю интернет, думаю разберусь.
-
Ну можно и иначе сделать, пришлешь проект текущий мне, скажешь пути, я сделаю.. но позже несколько, может часа через 2-4.
Или могу тебе "рыбу" проекта состряпать
И вот еще... ты LRDesigner именно из той папки запускаешь? Что в нем кокретно делаешь?
Добавить datasource ? Там что пишешь?
-
Давай пока попробую сам разобраться с запуском из софтины.
По LRDesigner'у - запускаю из папки, жму Add database connection, заполняю как на скрине.
Check Connection -> Driver not loaded.
OK -> "кнопочка розеток" -> Driver not loaded
А про рыбу я не понял. :-[
-
Выбери QMySql вместо QMySql3.
"Рыба" - это шаблон, с подключением LM и т.д.
-
пробовал qmysql/qmysql3
-
Посмотри содержимое переменной окружения Path
-
Приложил скрин
-
не полная инфа.. давай иначе, запусти консоль, выполнить -> cmd
набери where libmysql.dll
-
Я отойду, чуть позже буду, прочитаю.
-
Соответственно выполнил. Указал директорию.
Попробовал убрать оттуда файл (переименовал), больше нигде не нашел.
Вернул файл - все норм.
Скрин приложил.
-
ну стало быть в этой части все нормально.
Надо пробовать из приложения LMDesigner запускать
-
Пробовал через system start - driver not loaded.
Курю QT запуск...
#include <QCoreApplication>
#include <QDebug>
#include <QtSql>
#include <QProcess>
static bool createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL3");
db.setDatabaseName("zabbix");
db.setUserName("ralfaruh");
db.setHostName("192.168.50.107");
db.setPassword("password");
db.setPort(3306);
if (!db.open()) {
qDebug() << "Cannot open database:" << db.lastError();
return false;
}
else
qDebug() << "db open";
return true;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
createConnection();
QProcess *process = new QProcess;
QString file = "D:/limereport/LRDesigner.exe";
process->start(file);
return a.exec();
}
С БД соединяется, в LRDesigner'е - Driver not loaded ::)
-
не-не.. в корне неправильно
Надо подрубить библиотеку к проекту.
Погодь, еще одна мысль... а ты LR качал бинарники или собирал?
-
Качал вот с https://sourceforge.net/projects/limereport/files/LR_1_3_12_binares_Qt5.5_VC2010_win32.7z/download .
Сам ничего не собирал.
-
а QT откуда качал?
-
Там у них загрузочник свой. Версия 5.2
Кажется я делал вот так
-
Ну судя по картинке ты установил сборку QT с MinGW.
Решение мне нравится больше, чем с VC, но в даннном случае возникает косяк.
Давай убедимся или опревергнем. Открой папку где стоит QT, что там есть?
-
Приложен скрин
-
нет, похоже VC а не MinGW.
Но вообще симптомы похожи на то, что не может LR зацепить libmysql.dll
Попробуй ее выкинуть из папки LR совсем. Пусть в c:/windows только лежит, не забудь в sqldrivers твою собранную либу оставить
-
Безуспешно :o
-
Значит надо собирать LR ручками.
У тебя QT 5.2.0, собранный тобой драйвер заточен под эту версию QT.
Бинарники LR собраны на базе QT 5.5.0, насколько я вижу. Видимо тут трабла. Тебе нужно из исходников LR собрать.
Завтра могу пошагово помочь. У меня уже полночь сейчас. Или поковыряй форум LR, там должно быть руководство к сборке.
-
Subst, я только что собрал ручками LR))
Успех есть))!!
Законнектился к базе!
ТЕПЕРЬ НАДО КУРИТЬ SQL))))))))))))))
-
Ну с почином :D
Дерзай, будут вопросы - пиши
-
Вопросы уже появляются, но задавать пока не буду ::)
Огромное спасибо за помощь! ;D
-
День добрый.
Подскажите, нужно ли менять какие-либо настройки, чтобы интерфейс собираемого проекта(limereport.pro) был русскоязычным?
-
интерфейс проекта?
или интерфейс дизайнера все же?
-
Получается, что дизайнера
-
Нужно установить транслятор, что-то вроде того :
QTranslator limeReportTranslator;
QString translationPath = QApplication::applicationDirPath();
translationPath.append("/languages");
limeReportTranslator.load("limereport_"+QLocale::system().name(),translationPath);
a.installTranslator(&limeReportTranslator);
-
Нужно установить транслятор, что-то вроде того :QTranslator limeReportTranslator;
QString translationPath = QApplication::applicationDirPath();
translationPath.append("/languages");
limeReportTranslator.load("limereport_"+QLocale::system().name(),translationPath);
a.installTranslator(&limeReportTranslator);
В файле /designer/main.cpp это уже сделано, но язык при этом остается английским
-
Нужно проверить есть ли рядом с исполняемым файлом папка languages в которой должны лежать переводы вида limereport_*.qm
-
Нужно проверить есть ли рядом с исполняемым файлом папка languages в которой должны лежать переводы вида limereport_*.qm
Создал папку "languages" в \LimeReport-master\build\5.9.1\win32\debug\designer
Скопировал в нее файлы *qm. из \LimeReport-master\translations
Не помогло.
Или надо переводы цеплять к demo_r1?
-
А вы designer запускаете или demo_r1?
-
А вы designer запускаете или demo_r1?
Судя по всему запускается все-таки demo_r1. (в QtCreator открыт проект limereport.pro)
-
В qtcreator можно выбрать запускаемый подпроект
-
В файле /designer/main.cpp заменил строку
limeReportTranslator.load("limereport_ru"+QLocale::system().name(),translationPath);
на
limeReportTranslator.load("limereport_ru",translationPath);
После этого заработало. Иначе получалось неверное имя файла.
Либо, можно переименовать файлы локализации.
-
По умолчанию дизайнер берет локаль системы и если она не Russian то соответственно дизайнер русским не будет ;) И принудительная загрузка русского в этом случае самое то :) В новой версии дизайнера можно будет менять язык интерфейса из настроек
-
По умолчанию дизайнер берет локаль системы и если она не Russian то соответственно дизайнер русским не будет ;) И принудительная загрузка русского в этом случае самое то :) В новой версии дизайнера можно будет менять язык интерфейса из настроек
запрос имени системной локали возвращает "ru_RU". В результате и получается неверное имя файла.
-
bool QTranslator::load() последовательно перебирает возможные названия локалей и если не нашел limereport_ru_RU.qm загузит limereport_ru.qm.
в исходном main.cpp
limeReportTranslator.load("limereport_"+QLocale::system().name(),translationPath);
а не
limeReportTranslator.load("limereport_ru"+QLocale::system().name(),translationPath);
-
запрос имени системной локали возвращает "ru_RU". В результате и получается неверное имя файла.
[/quote]
To amkru: Название файла локализации - это вобщем-то ваша зона желаний и ответсвенности, есть общие правила, довольно относительные. Это в первую очередь - файл заканчивается названием локали, а начинается именем проекта, в остальном Ваша фантазия. Так что прописывайте как угодно, хоть явно файл укажите.
-
И снова здравствуйте! ;)
Набежали такие вопросы:
1) Что это за язык (если можно так назвать)? Хочется понять, что с ним можно делать и как. (Приложен скрин)
2) Могу ли я вывести значение только одной строки? ???
3) Могу ли я получить значения из связной таблицы (через внешний ключ).
Спасибо
-
1) Язык - изобретение Алекса по большей части. Что он брал за отправную точку - спросим у него :D Вообще, в LR используется скриптовый язык, основанный на Ecma-262. JavaScript еже с ним тоже на этом стандарте основаны. Кое-что есть в Assiatant по теме QScriptEngine
2) Создай dataSource c ограничением типа select * from Table where id=42, и будет столько строк сколько попадут под where
3) смотри доку по LR, она не богата по содержанию, всего не раскрывает, старая уже. Но ЭТОТ моент там хорошо показан. Раздел "Создание наборов данных в отчете"
-
Спасибо за быстрый ответ!
Продолжаю изучать ;)
-
по 3) смотри также demo_r1/demo_reports/categories.lrxml
-
Доброго времени суток!
Подскажите пожалуйста, как в бэнде с данными менять выравнивание по горизонтали (left, right, center ...) текста в поле по некоторому условию (условное форматирование)?
Заранее спасибо!
-
To Vernilion:
Приветствую!
С помощью скрипта в текстовом итеме.
Примерно, так (содержимое textItem)
$S{
if (1>0)
THIS.alignment=2; // Qt::AlignRight
else
THIS.alignment=1; // Qt::AlignLeft
"klop";
}
-
Спасибо огромное за подсказку! :D
Есть ли где то описание всех методов и свойств объекта THIS?
Чтобы не засорять нубскими вопросами форум, есть ли где то описание всех фичей репортера и скриптового языка?
-
Есть.. у Алекса и в исходниках :)
А если более серьезно, смотри, свойства итема в дизайнере. По сути эти свойства и можно применять в THIS
Например смотрю есть autoHeight... отлично, пишу в скрипте THIS.autoHeight=true
Если пороешь исходники textItem'а, то увидишь, что именно они и интерпритируются применительно к THIS
-
Хорошо, будем копать!
Репортер очень радует своими возможностями, еще чуть чуть и будет по наворотам как FastReport, можно будет все самые бредовые отчеты, которыми у нас любит жить всякая отчетность, генерить. :D
-
Да куда уж больше возможностей...
с помощью скриптов и html можно, наверное, все сделать
-
Приветствую!
Еще есть пара вопросиков:
- как заставить pagefooter отображаться только на последней странице?
- можно ли управлять видимостью band-ов из скриптов?
Спасибо.
-
Хай!
1. А смысл отображать Page Footer только на последней странице (как следует из его названия, он отображается на всех страницах, включая или исключая последнюю и первую взаисимости от значений соответсвующих свойств) ? У тебя есть Report Footer.
Но если очень хочется см. п.2
2. Если тебе нужно из срипта управлять видимостью Band'а - я обычно пользую такое решение: ставишь autoHeight у Band'а и textItem'ов внутри Band'a. Сриптом (ами) регулирешь содержимое textItem'а (ов). При пустом содержимом ни item ни band виден не будет.
Это как вариант. Возможны и другие, как фантазии хватит.
-
Да п.2 нормальное решение, в скриптах смотреть на несовпадение текущего номера страницы и общего количества страниц.. Попробую, спасибо.
А по п1. ну вот такой отчет нужен, чтобы на последней странице внизу были данные, не зависимо от заполненности данными этой последней страницы. Понятное дело, что отчет может быть всего 1 страница - для него тоже это правило распространяется. А ReportFooter прижимается к последним данным на странице.. если бы его можно было принудительно отправить вниз страницы, тогда да..
Еще раз спасибо за совет.
-
по п.2 - Для textItem'ов все красиво получается, но вот на бэнде лежит картинка с Qr-кодом... Как ее придушить? Из скрипта можно управлять элементами, отличными от textItem?
-
Vermilion
- как заставить pagefooter отображаться только на последней странице?
Есть tearoffband это как раз то, что вам нужно, этот раздел печатается на последней странице в нижней её части.
Из скрипта можно управлять элементами, отличными от textItem?
В новой версии (ветка develop на github) можно делать вот так:
Reportpage1_DataBand1.beforeRender.connect(BRDataBand1)
function BRDataBand1(){
if (getField("customers.CustomerID") == "ANTON") {
Reportpage1_TextItem1.isVisible = false
// Reportpage1_TextItem1.fontColor = LimeReport.color("red")
}
}
-
Спасибо Alex!
Это решает мои проблемы!
-
Подскажите пожалуйста!
Есть две абстрактные модели. 1я хранит список маршрутов.
У каждого маршрута есть список точек.
Мне нужно распечатать для каждого маршрута список точек.
2я модель ссылается на объект маршрута и предоставляет список точек маршрута.
Что то типа:
Маршрут 1:
Точка 1 Координаты
Точка 2 Координаты
Маршрут 2:
Точка 1 Координаты
Точка 2 Координаты
Если я пытаюсь напечатать символ градуса, то выводится знак вопроса. Шрифт Arial
-
AAL
Вложенные структуры можно выводить через SubDetail band
Как строить связанные источники данных можно посмотреть в demo_r1 (master, detail источники)
Если я пытаюсь напечатать символ градуса, то выводится знак вопроса. Шрифт Arial
Если в контент TextItem попадает знак градуса то TextItem без проблем его выводит см. аттач
-
Вложенные структуры можно выводить через SubDetail band
Как строить связанные источники данных можно посмотреть в demo_r1 (master, detail источники)
То есть без сигналов и слотов не обойтись?
Вот так вот я смог решить свою задачу:
bool addModel(QAbstractItemModel *model)
{
bool result = report->dataManager()->addModel(model->objectName(), model, false);
if(result) {
QJSValue jsVal = report->scriptManager()->scriptEngine()->newQObject(model);
if(!jsVal.isNull())
report->scriptManager()->scriptEngine()->globalObject().setProperty(model->objectName(), jsVal);
}
return result;
}
----------------------------
В TextItem:
$S{
var wocId = $D{zonelinelist.wocId};
zoneline.wocId = wocId;
wocId;
}
-
Можно обойтись :) Пихаете 2 модели в отчет и на подчиненную накидываете прокси (Subdetail -> filterMode)
Сигналы слоты гибче :) А чем они вас не устраивают ?
-
Можно обойтись :) Пихаете 2 модели в отчет и на подчиненную накидываете прокси (Subdetail -> filterMode)
Сигналы слоты гибче :) А чем они вас не устраивают ?
С прокси я не понял как работать. Если примерчик дадите будет хорошо :)
К тому же если добавить в Fields map строку, и не заполнять ее, то при нажатии ОК падает. Удаление строки не работает.
В сигнал/слотовом варианте мне не нравится возвращаемый параметр для сигнала. К тому же из QML ничего вернуть нельзя.
Плюс появляется дополнительная зависимость библиотек, в которых эти модели существуют, от библиотеки печати.
-
С градусом так и не получается, но это уже походу моя проблема. Правда пока не знаю как решить.
В коде объявляю строку, которая в qDebug() уже с вопросом печатается:
QString format = "%1 %2°%3'%4''";
-
Помогла такая запись, но надолго ли ;D
QString format = QString::fromLocal8Bit("%1 %2°%3'%4''");
-
Вот примерчик (order_proxy)
Прокси поправлю :)
-
Все равно не понял как master влияет на detail.
Что должно быть у моей модели, чтобы выставить CustomerId?
-
Прокси фильтрует подчиненную модель по заданному полю, в данном случае это CustomerID.
В приведенном примере, обе модели имеют поле CustomerID, соответственно при перемещении по мастеру, в подчиненной модели выбираются все записи с условием detail.CustomerID = master.CustomerID
-
Доброго времени суток.
Создал переменную в шаблоне, хочу в нее записывать QImage через setVariable.
Можно ли так делать? А то у меня падает :)
ЗЫ. Вообщем не понятно почему стало падать, но падает
на функции:
BaseDesignIntf* HorizontalLayout::findNext(BaseDesignIntf* item){
if (layoutsChildren().count() < childItems().size()-1){
layoutsChildren().clear();// <<-- тут падает
foreach (BaseDesignIntf* childItem, childBaseItems()) {
layoutsChildren().append(childItem);
}
}
qSort(layoutsChildren().begin(),layoutsChildren().end(),horizontalLessThen);
for (int i=0; i<layoutsChildren().count();++i){
if (layoutsChildren()==item && layoutsChildren().size()>i+1){ return layoutsChildren()[i+1];}
}
return 0;
}
-
В develop ветке можно пропихнуть QImage через переменную.
Воспроизвести падение не получается, можно в меня демкой кинуть?
-
В демке все нормально, падает только на определенном наборе данных.
Причем дело не в картинке как оказалось.
Если получится определить причину, скину демку. В предыдущей версии все ок.
-
Фууух, ну и задачка попалась. Устал дебажить ;D
Вообщем вот тут происходит ошибка:
void PageItemDesignIntf::relocateBands()
{
if (isLoading()) return;
int bandSpace = (itemMode() & DesignMode)?4:0;
QVector<qreal> posByColumn;
qSort(m_bands.begin(),m_bands.end(),bandSortBandLessThenByIndex);
int bandIndex = 0;
if (!(itemMode() & DesignMode)){
while ( (bandIndex < m_bands.count()) &&
((m_bands[bandIndex]->bandType() == BandDesignIntf::TearOffBand) ||
(m_bands[bandIndex]->bandType() == BandDesignIntf::PageFooter) ||
m_bands[bandIndex]->bandType() == BandDesignIntf::ReportFooter )
){
bandIndex++;
}
}
if ( (m_bands.count()>0) && (bandIndex<m_bands.count()) ) {
initColumnsPos(posByColumn,pageRect().y(),m_bands[bandIndex]->columnsCount());
m_bands[bandIndex]->setPos(pageRect().x(),pageRect().y());
posByColumn[0]+=m_bands[bandIndex]->height()+bandSpace;
}
if(m_bands.count()>1){
for(int i=0;i<(m_bands.count()-1);i++){
if (((m_bands[i+1]->bandType()!=BandDesignIntf::PageFooter) &&
(m_bands[i+1]->bandType()!=BandDesignIntf::TearOffBand)) || (itemMode() & DesignMode)){
if (m_bands[i+1]->columnsCount()>1 &&
m_bands->columnsCount() != m_bands[i+1]->columnsCount())
{
qreal curPos = posByColumn[0];
initColumnsPos(posByColumn,
curPos,
m_bands[i+1]->columnsCount());
}
if (m_bands[i+1]->columnIndex()==0){
m_bands[i+1]->setPos(pageRect().x(),posByColumn[0]);
posByColumn[0] += m_bands[i+1]->height()+bandSpace;
} else {
//columnIndex()==-1
m_bands[i+1]->setPos(m_bands[i+1]->pos().x(),posByColumn[m_bands[i+1]->columnIndex()]);
posByColumn[m_bands[i+1]->columnIndex()] += m_bands[i+1]->height()+bandSpace;
}
}
}
foreach(BandDesignIntf* band, m_bands){
if (band->isSelected()) band->updateBandNameLabel();
}
}
}
-
У меня один заголовок настроен columnCount = 2. Сделал 1, все заработало.
Но опять же, проявляется не всегда. В тестовом не получается добиться падения
-
Какой эксепшн летит? Стектрэйс можно?
-
Смог добиться в тестовом.
Запускал под demo_r1
-
Супер, сегодня гляну.
-
AAL Я правильно понимаю, что у вас лайм валится на генерации отчета "categories" ?
У меня он генерится без каких либо проблем.
В нем и колонок то нет :) а я так понимаю проблемы именно в колонках.
-
AAL Поправил, пушнул (1.4.92)
-
У меня падает, если заголовок subdetailheaderband имеет 2 колонки и columnFillDirection = Horisontal,
а subdetailband имеет 2 колонки и columnFillDirection = Vertical.
Это как раз в прикрепленном файле и сделано. :)
-
Я скачиваю
http://limereport.ru/forum/index.php?action=dlattach;topic=109.0;attach=338
и получаю в результате categories.lrxml :) (Без колонок в том виде, в котором он есть изначально)
Может ошибка закралась в момент загрузки файла?
Я там пушнул изменения полагаю должно исправить ситуацию :)
Выловил еще один вылет буду ковырять дальше.
-
AAL 1.4.93 Должно все работать.
-
Ай, точно. Не тот файл скинул ))
Падение ушло, но есть небольшой косяк с заголовком, прилагаю картинку.
-
AAL Для Vertical пофиксил :), а для VerticalUniform даже не просите :), не буду делать.
-
Хорошо, и так все супер вроде :)
А для чего он, это Uniform?
-
AAL Равномерное распределение содежимого колонок на последней странице или перед следующим датабандом
-
День добрый.
Есть заполненная QStandardItemModel.
По коду:
report = new LimeReport::ReportEngine(this);
report->dataManager()->addModel("model", model, true);
report->designReport();
исправно выводит дизайнер отчёта.
А вот по коду:
report = new LimeReport::ReportEngine(this);
report->dataManager()->addModel("model", model, true);
report->loadFromFile("report.lrxml");
report->previewReport();
открывается только виджет, предпросмотра готового отчёта не видать.
Что я делаю не так?
P.S. report->printReport() показывает окно настройки печати.
Win 7 Pro Rus
Qt Creator 4.6.2
Qt 5.11.1
-
Ender X, ты уверен, что по заданному пути точно есть твой шаблон отчета?
Если он лежит рядом с исполняшкой (exe файлом), укажи явно
report->loadFromFile(qApp->applicationDriPath()+"/report.lrxml");
-
Ender X, ты уверен, что по заданному пути точно есть твой шаблон отчета?
Если он лежит рядом с исполняшкой (exe файлом), укажи явно
report->loadFromFile(qApp->applicationDriPath()+"/report.lrxml");
Спасибо! Помогло. :)
-
Здравствуйте, я новичок в qt, поэтому не могли бы вы обьяснить мне кое что. Я смог подключить LimeReport как библиотеку к своему проекту, при нажатии на кнопку я запускаю LimeReport :
LimeReport::ReportEngine m_report;
m_report.designReport();
Вопрос, как мне передать значения в отчёт не из бд, а из моей программы, грубо говоря я имею объект с тремя свойствами и хочу передать их в отчёт в виде таблицы.
Возможно вопрос глупый, но буду крайне признателен за разжеванный ответ, спасибо.
-
Kilek Приветствую!
В limereport можно передавать
1. переменные
report->dataManager()->setReportVariable(ui->leVariableName->text(), ui->leVariableValue->text());
2. Источники данных унаследованные от QAbstractItemModel
QSqlQueryModel* customersModel = new QSqlQueryModel();
customersModel->setQuery("select * from customers", m_db);
report->dataManager()->addModel("external_customers_data",customersModel,true);
QStringList simpleData;
simpleData << "value1" << "value2" << "value3";
QStringListModel* stringListModel = new QStringListModel();
stringListModel->setStringList(simpleData);
report->dataManager()->addModel("string_list",stringListModel,true);
https://www.youtube.com/watch?v=Wc_sPNuArjA
3. так называемые callback datasources
https://www.youtube.com/watch?v=IekDWzh251c
Останутся вопросы пишите.
-
Alex, спасибо за ответ, есть ещё два вопроса. Возможно ли из моей программы задавать шаблон, что бы пользователю открывался сразу готовый отчёт в LimeReport даже без необходимости нажатия на Render.
И есть ли механизм задания параметров для создания отчёта. Например, LimeReport принимает поле даты, но выводить будет только информацию за последний месяц.
-
Kilek
report->loadFromFile(fileName);
report->dataManager()->setReportVariable("VarName", "VarValue");
Можно установить переменные и потом в отчете формировать запросы с использованием этих значений.
report->preview() // Для вызова окна просмотра
report->print() // Для вывода на печать
report->printToPDF("FileName") // Печать в PDF
-
Я пытаюсь открыть файл lrxml, но Preview открывается пустым. Вот код из mainwindow.cpp:
QString fileName = QFileDialog::getOpenFileName(this,"Select report file");
if (!fileName.isEmpty()){
report.loadFromFile(fileName);
report.previewReport();//Открывает, но он пустой
}
Открываю файл из demo_1, этот же код в demo_1 работает правильно, что не так в моей программе, может что-то ещё нужно добавить? Понимаю, что нужно разобраться с demo_1, но я не особо шарю, что там к чему(
-
Kilek
Если вместо previewReport() вызвать designReport(), что открывается ? Дизайнер показывает шаблон отчета?
-
Всё разобрался, как всегда сам тупил)
-
Ну а выборку возможно делать только непосредственно подготавливая передаваемые значения в моём коде. В LimeReport нет возможности задать параметры для принимаемых значений? Просто, если я сделаю, к примеру, критерий по необходимой дате, а в другой ситуации программа не будет работать с датой, тогда придётся переписывать код, получается очень не универсально. Или всё-таки есть способ красиво обыграть данную ситуацию?
-
С данными, грубо говоря, есть два сценария:
1. limereport сам подготавливает данные, то есть на основании переменных строит запросы к БД и т.д.
2. Данные подготавливает внешнее приложение, и в этом случае они должны быть полностью готовы к использованию генератором отчетов.
В новой версии (develop ветка на github) можно управлять процессом генерации отчета посредством скриптов и, в зависимости от условия, предотвращать генерацию раздела, таким образом, по сути, осуществить фильтрацию. Вопрос эффективности в этом случае остается открытым, поскольку генератору отчетов придется перебрать все переданные записи, и если на выход уйдет, к примеру, 1% от переданного объема, то время ожидания формирования отчета может не соответствовать результату. Таким образом данные целесообразнее подготовить заранее для максимально быстрой генерации отчета.
-
Ок понятно, спасибо за ответ
-
Добрый день, если использовать callback datasources, то как передавать туда мои данные? К примеру у меня есть QVector, каждый элемент которого это объект класса, имеющий 4 параметра. Каким образом я могу адекватно представить их в отчете. С шаблоном и как показывать понятно, вопрос, как передать вектор в ColumnData?
case LimeReport::CallbackInfo::ColumnData:
date = info.columnName + “ “ + QString::number(info.index);
Я сначала пытался преобразовать вектор в QVariant и просто присвоить date, но так не работает, получается, что я вывожу одно значение во все колонки. Сейчас я думаю, что нужно передавать информацию в info. Но знаний и опыта у меня мало, так что решил спросить у вас.
-
Добрый день.
Если у вас есть массив объектов с некоторыми свойствами,
и вам из этого нужно получить табличное представление,
то следует сделать следующее :
1. case LimeReport::CallbackInfo::RowCount: // запрос кол-ва строк
data = myObjectsVector.size() // возвращаем кол-во строк в таблице равное количеству эл-тов. в массиве;
break;
2. case LimeReport::CallbackInfo::ColumnCount: // запрос кол-ва колонок
data = 4; // возвращаем кол-во свойств у объекта (Я так понял в вашем случае 4)
break;
3. case LimeReport::CallbackInfo::ColumnHeaderData: // запрос наименований полей
switch (info.index) {
case 0:
data = "Наименование первого свойства"; // Наименование первого свойства для названия поля
break;
. . .
case 3:
data = "Наименование четвертого свойства"; // аналогично
break;
}
4. case LimeReport::CallbackInfo::ColumnData: // запрос значений
if (info.columnName == "Наименование первого свойства")
data = myObjectsVector[info.index].property1Data; // Значение свойства (парамера)
. . .
if (info.columnName == "Наименование четвертого свойства")
data = myObjectsVector[info.index].property1Data;
Вот собствено и все :)
-
Огромное спасибо, вроде понял, сейчас буду пробовать)
-
Добрый день!
Подскажите, как в отчете сделать печать картинки (Элемент изображения) в PageFooter только для первой страницы?
-
Vermilion
Приветствую.
В develop версии можно в инитскрипте написать следующее:
ReportPage1.beforeRender.connect(ReportPage1BeforeRender)
function ReportPage1BeforeRender(){
if ( getVariable("#PAGE") != 1 ){
ReportPage1_ImageItem2.isVisible = false;
ReportPage1_PageFooter1.setItemHeight(0);
}
}
-
Спасибо Alex!
Будем пробовать!
-
Здравствуйте!
Подскажите, можно ли поменять цвет фона предпросмотра?
-
ldir
На данный момент этот функционал не предусмотрен.
Если сильно надо можно попробовать прикрутить.
-
ldir
Прикрутил в develop ветке.
Теперь можно делать так: report->setPreviewPageBackgroundColor(Qt::gray);
-
Спасибо за оперативность. Но моя программа стала падать при добавлении своей функции (на report->scriptManager()->addFunction)
-
ldir
Если раньше использовали мастер то:
1. У девелопа свои заголовочные файлы, важно - перед линковкой не забыть заменить старые на новые :)
2. По умолчанию в девелопе для обработки скриптов используется новый QJSEngine вместо QtScriptEngine,
а у него нет возможности добавлять свои функции так, как это было в старом движке.
Поскольку QtScriptEngine еще не полностью вырезан из Qt, сохраняется возможность его использования и в develop ветке
для этого нужно использовать флаг сборки CONFIG+=qtscriptengine.
В случае использования старого движка, сохранится возможность добавления своих функций как и раньше.
Если есть желание пересесть на новый движок, то свои функции можно передать через регистрацию в скриптовом движке
объекта унаследованного от QObject с Q_INVOKABLE функциями.
-
Пробую регистрировать свои функции как описано здесь:
http://limereport.ru/forum/index.php?topic=259.msg1511#msg1511 (http://limereport.ru/forum/index.php?topic=259.msg1511#msg1511)
Всё равно крашится на строчке 2:
My_ReportFunctions * functions = new My_ReportFunctions(this);
QScriptValue jsFuncs = report->scriptManager()->scriptEngine()->newQObject(functions);
но перед этим выдает QObject::connect: No such slot QJSEngine::_q_objectDestroyed(QObject*)
-
Какой эксепшн летит ?
-
Segmentation fault
-
А версия Qt какая?
-
5.7.1
-
Кроме кастомных функций остальное работает ?
-
Да, все остальное работает. И цвет серенький)
-
Так значит будем смотреть что с функциями :)
Первое, что смущает это то, что
QScriptValue jsFuncs = report->scriptManager()->scriptEngine()->newQObject(functions);
при сборке не ругается :) У нового движка вместо QScriptValue QJSValue
-
ldir
Пофиксил сборку под разные движки
-
Arin Alex
Спасибо! Только теперь не компилируется.
D:\QtProjects\LimeReport-develop\limereport\lrscriptenginemanager.cpp:1616: ошибка: 'class LimeReport::DataSourceManager' has no member named 'fieldDataByRowIndex'
return dm->fieldDataByRowIndex(fieldName, rowIndex);
^
-
Да, я уже заметил :) Вчера забыл пушнуть финальные изменения. Сейчас должно компилироваться.
-
Пока не забыл. А как количество копий при печати задавать?
-
ldir
В диалоге выбора принтера указывается
-
Решил ради научного интереса попробовать собрать с CONFIG+=qtscriptengine (я его в limereport.pro добавил, правильно?). Лайм собрался, а вот моя программа нет. Ругается на отсутствие <QQmlEngine> в lrscriptenginemanagerintf.h :(
-
У себя в приложении в pro файл добавьте DEFINES += USE_QTSCRIPTENGINE
-
У себя в приложении в pro файл добавьте DEFINED += USE_QTSCRIPTENGINE
Понял.
А на счет В диалоге выбора принтера указывается
не совсем. Вы имеете ввиду каждый раз при печати вручную указывать?
-
ldir
Если принтер не был передан в limereport, то в диалоге выбора принтера можно руками указать.
Если передаете принтер, то у него printer.setCopyCount()
-
Что-то уже стыдно, но я уже запутался
Решил ради научного интереса попробовать собрать с CONFIG+=qtscriptengine (я его в limereport.pro добавил, правильно?). Лайм собрался, а вот моя программа нет. Ругается на отсутствие <QQmlEngine> в lrscriptenginemanagerintf.h :(
У себя в приложении в pro файл добавьте DEFINES += USE_QTSCRIPTENGINE
Добавил, скомпилировалось и .... получил вылет на старой доброй addFunction.
Да, в сообщениях лайма есть qjsengine, а qtscriptengine нету.
-
ldir
CONFIG+=qtscriptengine нужно добавить в параметры qmake.
Если собираете QtCreator'ром то это Projects -> Build Steps -> qmake -> Additional arguments
-
ldir
CONFIG+=qtscriptengine нужно добавить в параметры qmake.
Если собираете QtCreator'ром то это Projects -> Build Steps -> qmake -> Additional arguments
Чет туплю. Спасибо.
Правда я его в common.pri сунул и все заработало.
-
Если принтер не был передан в limereport, то в диалоге выбора принтера можно руками указать.
Если передаете принтер, то у него printer.setCopyCount()
А где его можно передать? Передачу принтера я нашел только в этих методах:
bool printReport(QPrinter *printer=0);
bool printReport(QMap<QString, QPrinter*> printers, bool printToAllPrinters = false);
bool printPages(ReportPages pages, QPrinter *printer);
Так это уже сама печать. Превьюхе его передать нельзя, а мне бы хотелось показать документы и оттуда уже печатать. Или такой возможности нет?
-
ldir
Могу прикрутить передачу принтера в превью, если надо или вообще установку дефолтного для всех операций.
-
Arin Alex
Буду премного благодарен если можно будет передавать принтер.
-
Ок, прикручу.
-
Прикрутил :) previewReport(QPrinter* printer, PreviewHints hints = PreviewBarsUserSetting);
-
Низкий Вам поклон.
-
Алекс, извините, может уже задолбал Вас, но после последнего обновления появилась проблема с печатью, если передать принтер:
QPrinter printer;
printer.setCopyCount(optionsDocuments.copiesCertificate);
report->previewReport(&printer);
При нажатии на печать окно выбора принтера не появляется и сыпятся ошибки типа QWin32PrintEngine::begin: StartDoc failed, document "document1" ()
Если его не передавать, то все ОК.
Подозреваю что если передавать принтер, то при нажатии на печать сразу идет попытка печати на дефолтном принтере.
-
Ну принтер то должен быть проинициализорован :)
Вы принтер должны передать уже готовый к печати.
Я так понимаю весь сыр бор из-за количества копий ?
Вызовите диалог выбора принтера, после установите у него кол-во копий :)
-
Я так понимаю весь сыр бор из-за количества копий ?
В общем то да. В разных документах может быть разное количество копий. Я просто ориентируюсь на родное Qt-шное превью (все-таки привык к нему) - там я тоже передавал принтер с установленным количеством копий и при нажатии на печать выбирал нужный принтер. В принципе можно и руками установить нужное количество, но очень хочется избавиться от лишнего кнопкодавства. Ладно, я пойду другим путем.
В любом случае спасибо.
-
Еще один вопрос появился. А как узнать размеры страницы документа? Поясню зачем: по-умолчанию в настройках принтера формат бумаги задан А4 - назовем его дефолтным. Если печатать документ такого формата то все нормально. Но у меня есть и А5, и другие форматы, размеры которых я не знаю - кастомные (у меня есть два типа конвертов). Так вот при печати на принтере по-умолчания эти кастомные форматы не учитывают размер бумаги - печать все равно идет в дефолтном формате А4. Соответственно текст вылезает за пределы страницы. Если же задать нужный формат в настройках принтера, тогда печатается правильно.
Как я уже говорил, раньше пользовался родной Qt-шной превьюхой. Там этой проблемы не было. Но приходится переходить на превью лайма из-за того, что родное превью очень долго обрабатывает большое количество страниц - 130 штук около двух минут.
-
ldir
А в самом шаблоне отчета какой формат стоит ?
-
Arin Alex
A5
-
А установка setPageSizeToPrinter у страницы не исправляет ситуацию ?
-
Это я не пробовал. Завтра проверю. Спасибо за подсказку. Я пока откатился на версию 1.4.80 и вернул стандартное преьвю. В этой версии обработка большого количества идет в разы быстрее, секунд за 5 против двух минут. Проверял на том же количестве.
-
Вернулись на master ?
2 минуты генерация отчета идет ?
-
Да пришлось вернуться. Из-за длительного времени формирования отчета все и началось. НО, только в Qt-шной превью QPrintPreviewDialog. Проблем с тормозами в превью лайма нет.
Вернулись на master ?
2 минуты генерация отчета идет ?
Дело не только в мастере. В версии мастер 105 (вроде) отчет тоже очень долго фомируется.
-
Интересно :) А можете, если не сложно, найти версию на которой начинаются тормоза?
Хочется понять где собака порылась :) Я там превъю поправил в develop,
теперь принтер как и в кутишном варианте всегда инициализируется диалогом
с учетом переданного принтера.
-
Интересно :) А можете, если не сложно, найти версию на которой начинаются тормоза?
Постараюсь завтра найти. Но однозначно в 1.4.80 проблем со скоростью не наблюдается. После нее я использовал 1.4.105, но чтобы не быть голословным я завтра проверю. Я честно говоря и не подозревал о том, что 105-я медленнее. Лишь несколько дней назад возникла необходимость в обработке большого количества страниц.
-
В общем проверил еще раз мастер 80, 105 и до кучи последнюю 123. Во всех скорость приблизительно одинаковая до 10 секунд. А вот в девелопе результат более чем полторы минуты (на AMD A4-4020). Так что разница в мастере и девелопе налицо.
Также в девелопе проверил превью лайма - очень быстро - около пяти секунд. И да, спасибо. Последняя версия то что доктор прописал.
-
Приветствую еще раз!
Подскажите как задать денежный формат (или числовой) в виде "100,00"? Нашел функцию currencyFormat, а как в ней задавать формат не пойму.
Уже разобрался - нашел в примерах
-
Здравствуйте!
Подскажите, можно ли программно (не в дизайнере, а непосредственно перед печатью) добавить в отчет textItem определенного размера, содержания и в определенных координатах?
-
Приветствую!
Добавить нельзя. Можно в дизайнере добавить, а из кода убрать :)
Или есть желание ко всем отчетам добавлять некую метку?
-
Или есть желание ко всем отчетам добавлять некую метку?
\
Ага оно
-
Я подумаю :)
-
Прикрутил в девелопе возможность создания меток для всех отчетов.
Теперь что-то вроде этого можно делать:
report->addWatermark(LimeReport::WatermarkSetting("Test",LimeReport::ItemGeometry(5,5,10,5), QFont("Arial",10)));
для удаления меток report->clearWatermarks();
-
Arin Alex, спасибо!
Появилось два вопроса. Как узнать геометрию страниц отчета (для центрирования)? И второй. Как поменять шрифт? Что-то не получается поменять, ни размер ни сам шрифт что бы ни указывал.
-
ldir, С шрифтом косякнул :)
А вот геометрию страницы узнать проблематично, ибо она недоступна :)
Подумаю как сделать.
-
Arin Alex, спасибо. Буду ждать.
-
ldir, Поправил шрифт и прикрутил якорь к геометрии, теперь положение метки вычисляется относительно краев или центра страницы.
использовать как-то так :
report->addWatermark(LimeReport::WatermarkSetting("Test",LimeReport::ItemGeometry(-5,-5,10,5, Qt::AlignCenter | Qt::AlignBottom), QFont("Tahoma",10)));
-
Arin Alex, благодарю. Попробую - отпишусь.
-
Arin Alex, еще такой вопрос. А есть ли DataFooter'а возможность печати на каждой странице как у DataHeader'а? А то в договоре идет таблица со спецификациями которая может растянуться более чем на одну страницу, а подписи нужны на каждой. Вариант с нижним колонтитулом не подходит, т.к. после спецификаций должен быть еще TextItem с ценами (его я сунул в ReportFooter).
-
Не хотел создавать новую тему, напишу здесь. Не знаю что это. Глюк или какая-то особенность, но если в одном скрипте будут функции COUNT() и SUM(), то получаю ошибку: Функция SUM не найдена или вызвана с неверными аргументами. Это если вызываемые функции идут в этом же порядке, т.е. сначала COUNT потом SUM, если наоборот, то будет другая ошибка - Can't find variablе... далее то что идет после COUNT().
-
ldir, По первому вопросу - я думаю, решением может быть скрытие подписей в колонтитуле страницы,
для этого можно использовать переменную #IS_LAST_PAGEFOOTER.
По второму - можно посмотреть само выражение где эти функции SUM и COUNT используются ?
-
Arin Alex, первый вопрос пока решил с использованием комбинации DataFooter'а и PageFooter'а с включением флага "Печать на первой странице" у последнего. Не знаю правильно ли это. Полагаю, если данные растянутся на одну - максимум две страницы, то все будет как надо. На три и больше вряд-ли.
А вот с вышеописанными функциями вообще интересно. Содержимое Item'а выглядит так (хромой Item находится на DataFooter'е относящимся к DataBand1):
Всего повреждено $S{
var res = "____________";
var n = SUM($D{corruptedsealsmodel.Counter},"DataBand1");
var counter = COUNT($D{corruptedsealsmodel.Counter},"DataBand1") ;
if(counter != 0)
{
res =n;
}
res;
} штук.
Самое интересное, если туда же добавить еще один Item, содержащий функцию SUM,
$S{var n = SUM($D{corruptedsealsmodel.Counter},"DataBand1");
n;
}
то обработка проходит правильно - как в одном, так и во втором Item'e!
Забыл сказать, количество строк в выводимой таблице больше нуля.
-
ldir, А ветка какая master или develop?
-
Arin Alex, девелоп. Если важно, то данные передаются через модель.
-
ldir, Страно, у себя проверяю вот такой скрипт
Всего повреждено $S{
var res = "_____";
var c = COUNT($D{test.2},"DataBand1");
var s = SUM($D{test.2},"DataBand1")
if (c !=0) {
res = s;
} else {
res;
}
} штук
и отрабатывает нормально
-
Извиняюсь, но пока решается текущий вопрос хочу уточнить такой момент (может конечно где-то на форуме есть ответ, но найти не могу): если где-нибудь в скрипте какого-либо Item'а была определена переменная, например, qwe и ей было присвоено значение, то в любом другом нижеследующем Item'e (даже на другой странице) эта переменная будет доступна. Это так должно быть? Или это баг?
-
У меня тот же код:
Всего повреждено $S{
var res = "_____";
var c = COUNT($D{corruptedsealsmodel.Counter},"DataBand1");
var s = SUM($D{corruptedsealsmodel.Counter},"DataBand1")
if (c !=0) {
res = s;
} else {
res;
}
} штук
выдает это: Всего повреждено ReferenceError: Can't find variable: s штук
-
Скриптовый контекст один на весь отчет, благодаря этому можно в инит скрипте объявить функции и юзать во всех айтемах.
Можете взять крайнюю версию и я вам на проверку свой отчет заброшу ?
-
Arin Alex, понял.
Да, конечно. Я через час-полтора буду дома и проверю. Без вашей помощи проблему не решу, сам часа 2 бился. Уже в себе сомневаться начал.
-
Еще раз попробовал дома в последней девелоп версии. Те же яйца. Жду Ваш отчет для теста.
-
ldir, Я нашел проблему :) Просто на 5.12 её уже нет :) Сейчас поправлю пушнусь
-
ldir, Все, можно забирать :)
-
Arin Alex, большое спасибо. Теперь работает.
-
Только ватермарка где-то потерялась...
-
ldir, У меня вроде работает :)
report->addWatermark(
LimeReport::WatermarkSetting(
"Test",
LimeReport::ItemGeometry(-5,-5,10,5, Qt::AlignCenter | Qt::AlignBottom),
QFont("Tahoma",10)
)
);
Выводится в центре нижней части страницы
-
То ли лыжи не едут, то ли я ....
У меня даже на пустом листе не выводится
-
Вот жеж странно
-
А до этого выводилась ?
-
В первый и последний раз была когда Вы ее только добавили, в ней еще шрифт не менялся. На 16-й странице сообщение #233. После того до сегодняшнего дня не пробовал.
-
А вы мой пример пробвали у себя повторить ?
Просто я поменял алгоритм размещения метки сделав его зависимым от якоря.
-
Скопировал и вставил.
-
Вот тут я совсем не понимаю :) У меня все ок :)
А если в demo_r1 в коструктор окна MainWindow вставить ?
Тоже не будет метки ?
-
У меня это вот так выглядит
-
А вот так у меня
-
ldir, Все перепробовал :) Уже и под виндами собрал :) Ну не пропадает у меня водянка.
Вот уже даже не знаю куда копать
-
Arin Alex, только что попробовал в режиме отладки - выводится!!! А в релизе нет(.
-
ldir, А попробуйте клирануть релиз, а еще лучше удалить все папки с собранными бинарниками
-
Не помогло. Сейчас попробую в какой нибудь другой проект репорт сунуть. Хотя, если в дебаге работает, а в релизе нет то вряд ли.
-
Попробуйте по новой на чистую склонировать limereport и сбилдить его
И в demo_r1 метку добавить
Просто я проверял и в дебаге и релизе все одинаково, да и, собственно, в плане водянки,
что дебаг, что релиз, должно быть пофиг :)
-
Хоть на изнанку вывернись. Все удалил, по новому скачал. В дебаге есть, в релизе нет. Но ведь чудес не бывает.
-
Версия Qt какая ? Компилятор ?
-
5.7.1, 5.11.3 Mingw 5.3
-
Кажется получилось повторить. Сейчас буду разбираться
-
Поправил, пушнул :)
Перед сборкой обязательно клирануться :)
-
Arin Alex, спасибо! Заработало.
-
Доброго времени суток.
Подскажите, как в таблице на странице подавить отображение повторяющегося значения в столбце, но на следующей странице это значение снова должно отобразиться на первой строке таблицы?
Типа:
Колонка1 | Колонка2 | Колонка3 |
Сидоров | Апрель | 122 |
| Март | 177 |
| Апрель | 222 |
| Май | 77 |
-
Vermilion, Процесс не простой, но возможный :)
Для этого нужно взять крайний комит в develop ветке (Специально сделал изменения под это дело).
Далее в поле где выводится Фамилия пишем нечто вроде этого:
$S{
if (CustomerID !=$D{detail.CustomerID}) {
$D{detail.CustomerID};
CustomerID = $D{detail.CustomerID}
} else {
"";
}
}
А в стартовом скрипте
var CustomerID = "";
Reportpage1.afterRender.connect(AfterPageRender);
function AfterPageRender(){
CustomerID = "";
}
-
Здравствуйте, интересует возможность фильтрации в LimeReport.
Вводные: имеется таблица Продукты и Продажи, в продажах есть несколько столбцов (продавец, продукт, время продажи и тп).
Перед запуском отчета пользователь может указать продукт(-ы), продавцов, промежуток времени и тп(aka фильтрация).
В band вывожу название продукта и заголовочную часть таблицы. Далее создаю datasource к таблице Продаж, где включаю subquery mode и в качестве master указываю таблицу Продуктов. Использую этот datasource в SubDetailBand.
Таким образом получаю несколько таблиц, Продукт и Продажи для этого продукта. Но не могу понять как сделать фильтрацию по остальным столбцам (время, продавец и тп).
При создании datasource в окне sql использовать внешние переменные не получается (хотел вставить после where).
Можно заранее отсортировать и передать модель, но т.к. продукт меняется от таблицы к таблице, запрос должен меняться тоже.
Т.е. в SubDetailBand модель не используешь (нельзя провести фильтрацию по продукту созданного из модели datasource).
Заметил, что запрос, используемый для создания datasource хранится в xml шаблоне, можно сделать поиск по этому файлу и перед запуском предпросмотра для запроса, который создает datasource, менять значения условия после where (разумеется, оставляя Product=$D{Sales.Product}), но это выглядит как огромный костыль.
Буду рад любому совету.
-
Vermilion, Процесс не простой, но возможный :)
Для этого нужно взять крайний комит в develop ветке (Специально сделал изменения под это дело).
Далее в поле где выводится Фамилия пишем нечто вроде этого:
$S{
if (CustomerID !=$D{detail.CustomerID}) {
$D{detail.CustomerID};
CustomerID = $D{detail.CustomerID}
} else {
"";
}
}
А в стартовом скрипте
var CustomerID = "";
Reportpage1.afterRender.connect(AfterPageRender);
function AfterPageRender(){
CustomerID = "";
}
Спасибо, Alex! Буду пробовать ;D
-
dim0n-333,
При создании datasource в окне sql использовать внешние переменные не получается (хотел вставить после where).
Вот тут не понял. Вы можете использовать переменные отчета в запросе точно так же, как и данные из других источников данных.
Вы можете, например, написать: where CustomerID like $V{CustomerID}, а в переменой будет зачение %ALFKI%
-
dim0n-333,
При создании datasource в окне sql использовать внешние переменные не получается (хотел вставить после where).
Вот тут не понял. Вы можете использовать переменные отчета в запросе точно так же, как и данные из других источников данных.
Вы можете, например, написать: where CustomerID like $V{CustomerID}, а в переменой будет зачение %ALFKI%
Мне нужно отправить запрос вида:
select * from Sales where Product=$D{Product.Id} and Seller=2 and Date between 'date1' and 'date2';
Причем в зависимости от выбора пользователя запрос может быть и таким:
select * from Sales where Product=$D{Product.Id} and Date between 'date1' and 'date2';
select * from Sales where Product=$D{Product.Id} and Seller=2;
select * from Sales where Product=$D{Product.Id};
Поэтому я планировал сформировать часть после Product=$D{Product.Id} как строку, записать в переменную и передать в LimeReport
А уже в sql запросе для формирования datasource записать
select * from Sales where Product=$D{Product.Id} and $V{filter};
Но почему-то в результате такого запроса я получаю таблицу без строк.
P.S. Если это имеет значение, в качестве базы данных используется SQLite.
-
dim0n-333,
Но почему-то в результате такого запроса я получаю таблицу без строк.
Это происходит из-за того, что параметры в обычном режиме передаются через bind.
Если есть желание просто кусок sql вставить через переменную, то нужно использовать $V{VarName, nobind}
-
dim0n-333,
Но почему-то в результате такого запроса я получаю таблицу без строк.
Это происходит из-за того, что параметры в обычном режиме передаются через bind.
Если есть желание просто кусок sql вставить через переменную, то нужно использовать $V{VarName, nobind}
Опишу все по порядку:
В программе задаю переменную:
m_report.dataManager()->setReportVariable("filterProduct", "Product=1");
Далее создаю datasource и в поле sql пишу для проверки:
select * from Sales where $V{filterProduct, nobind};
Нажимаю preview.
Появляется сообщение об ошибке "Количество параметров не совпадает".
Для проверки пишу туда же:
select * from Sales where Product=1;
Вижу таблицы с заполненными строками, т.е. все нормально.
-
dim0n-333, Параметр nobind был добавлен в новую версию, которая находится на github в ветке develop
-
Arin Alex, здравствуйте!
Подскажите пожалуйста, есть ImageItem на DataBand и таблица, в одном из полей которой содержатся имена файлов с изображениями. Файлы живут в папке. Можно ли как-то отобразить их в ImageItem? Datasource и field указал, в resourcePath задал путь к папке с файлами - картинки не выводятся. Или изображения должны обязательно храниться в базе?
-
dim0n-333, Параметр nobind был добавлен в новую версию, которая находится на github в ветке develop
Arin Alex, при использовании LimeReport с ветки develop появляется огромное число ошибок (скрин во вложении).
Попробовал взять с ветки master, компилируется нормально.
P.S. Не дождался ответа, снова вернулся к модулю отчетов, нашёл в ошибках нехватку файла Qml или типа того.
Дописал в .pro файл:
QT += qml
А также добавил в заголовках форм, где использую LimeReport
#include <QtQml>
Скомпилировалось, запустилось.
Напомню, в программе прописано:
m_report.dataManager()->setReportVariable("filterProduct", "Product=1");
Снова в поле sql пишу для проверки:
select * from Sales where $V{filterProduct, true};
Появляется ошибка "Отсутствует запрос Невозможно получить строку"
Для проверки пишу туда же:
select * from Sales where Product=1;
Получаю таблицу.
-
dim0n-333,Приветствую!
Прошу прошения за долгое молчание, был в таких местах где доступ к интернет отсутствовал как факт :)
select * from Sales where $V{filterProduct, true};
нужно заменить на:
select * from Sales where $V{filterProduct, nobind};
-
ldir, Приветствую!
resourcePath, на данный момент, должен указывать на путь к файлу, а не к директории.
Но я думаю, что это дело можно немного поправить :)
-
dim0n-333,Приветствую!
Прошу прошения за долгое молчание, был в таких местах где доступ к интернет отсутствовал как факт :)
select * from Sales where $V{filterProduct, true};
нужно заменить на:
select * from Sales where $V{filterProduct, nobind};
Удивительное совпадение, только что написал nobind, все заработало, и тут вижу ваше сообщение.
Так как в версии с ветки master nobind не приносил результата, решил, что это булевский параметр,
а после замены на версию с ветки develop почему-то не протестировал вариант с nobind.
В любом случае, спасибо за ответы, если будут ещё вопросы, напишу)
-
ldir, Приветствую!
Я изменил обработку свойства resourcePath в ImageItem терперь в нем можно использовать переменные и поля источников данных.
-
Vermilion, Процесс не простой, но возможный :)
Для этого нужно взять крайний комит в develop ветке (Специально сделал изменения под это дело).
Далее в поле где выводится Фамилия пишем нечто вроде этого:
$S{
if (CustomerID !=$D{detail.CustomerID}) {
$D{detail.CustomerID};
CustomerID = $D{detail.CustomerID}
} else {
"";
}
}
А в стартовом скрипте
var CustomerID = "";
Reportpage1.afterRender.connect(AfterPageRender);
function AfterPageRender(){
CustomerID = "";
}
Приветствую, Arin Alex!
Скажите, а Ваши доработки не попали еще в master ветку? я взял сегодняшнюю 1.4.128 ветку, доработал отчет, как Вы рекомендовали, все нормально, первая страница формируется так как задумано, но на второй странице повторение подавленного значения появляется только на второй строке данных, хотя должна появиться на первой строке 2-й страницы... по логике работы скрипта. Куда копать?
Ветка develop криво интегрируется в приложение, не хотелось бы с ней линковаться..
-
Vermilion, Приветствую!
Некоторые доработки в master в принципе не попадают :) Потому как следующаяя версия будет та, которая находится в девелопе.
Ветка develop криво интегрируется в приложение, не хотелось бы с ней линковаться..
Можно поподробнее ?
-
Vermilion, Приветствую!
Некоторые доработки в master в принципе не попадают :) Потому как следующаяя версия будет та, которая находится в девелопе.
Ветка develop криво интегрируется в приложение, не хотелось бы с ней линковаться..
Можно поподробнее ?
У меня собрана статическая версия Qt5.7.1 с поддержкой PSQL, ODBC и SQLite. В сборку включен минимум библиотек. Qml не используется и прочие "вкусности" я тоже не включаю в сборку фреймфорка. Я Вашу библиотеку включаю как часть своего приложения (через limereport.pri). Т.е. не собираю lib и потом не прилинковываю ее к проекту.
Для примера я в папке с проектом designer делаю designer.pro следующего содержания:
#-----
CONFIG += no_formdesigner no_embedded_designer
QT += core gui
TARGET = LRDesigner
TEMPLATE = app
HEADERS += $$PWD/designersettingmanager.h
SOURCES += $$PWD/main.cpp \
$$PWD/designersettingmanager.cpp
RESOURCES += $$PWD/../3rdparty/dark_style_sheet/qdarkstyle/style.qrc
include($$PWD/../limereport.pri)
MOC_DIR = moc
OBJECTS_DIR = obj
UI_DIR = ui
UI_HEADERS_DIR = ui
UI_SOURCES_DIR = ui
RCC_DIR = rcc
#-----
при выполнении qmake получаю ошибки с поиском файлов:
Project MESSAGE: TOP_BUILD_DIR:
Project MESSAGE: Debug
Project MESSAGE: uitools
Project MESSAGE: qjsengine
Project MESSAGE: TOP_BUILD_DIR:
Project MESSAGE: Debug
Project MESSAGE: uitools
Project MESSAGE: qjsengine
WARNING: Failure to find: ..\3rdparty\zint-2.6.1\backend_qt4\qzint.cpp
WARNING: Failure to find: ..\3rdparty\zint-2.6.1\backend\maxipng.h
WARNING: Failure to find: ..\3rdparty\zint-2.6.1\backend_qt4\qzint.h
Project MESSAGE: TOP_BUILD_DIR:
Project MESSAGE: Release
Project MESSAGE: uitools
Project MESSAGE: qjsengine
WARNING: Failure to find: ..\3rdparty\zint-2.6.1\backend_qt4\qzint.cpp
WARNING: Failure to find: ..\3rdparty\zint-2.6.1\backend\maxipng.h
WARNING: Failure to find: ..\3rdparty\zint-2.6.1\backend_qt4\qzint.h
странно, но qzint.pri я не трогал.. почему qmake не видит эти файлы.. такое впечатление, что переменная $$ZINT_PATH в какой то момент искажается..
С исходниками из master такого не наблюдается.. скорее всего недостаточно настроек я указываю в проекте, где копать не могу понять..
-
Vermilion, я конечно могу ошибаться, но в версии библиотеки на develop ветке используется Qml.
Например, когда я взял либу с ветки develop (изначально использовал с ветки master), пришлось дописать в .pro файл
QT += qml
P.S. Кое-что нагуглил, мб поможет:
Предположительно, QtCreator не находит файлы заголовков, перечисленные в файле .pri. Если ваш .pri файл находится в другой директории, отличной от вашего .pro файла, Qt ищет файлы, перечисленные в файле .pri, в том же каталоге, что и файл .pri(а не. pro file), и любой относительный путь будет разрешен из этого каталога.
Когда файл не может быть найден, QtCreator молча игнорирует его и просто не добавляет его в папку в представлении проектов.
-
Vermilion, я конечно могу ошибаться, но в версии библиотеки на develop ветке используется Qml.
Например, когда я взял либу с ветки develop (изначально использовал с ветки master), пришлось дописать в .pro файл
QT += qml
P.S. Кое-что нагуглил, мб поможет:
Предположительно, QtCreator не находит файлы заголовков, перечисленные в файле .pri. Если ваш .pri файл находится в другой директории, отличной от вашего .pro файла, Qt ищет файлы, перечисленные в файле .pri, в том же каталоге, что и файл .pri(а не. pro file), и любой относительный путь будет разрешен из этого каталога.
Когда файл не может быть найден, QtCreator молча игнорирует его и просто не добавляет его в папку в представлении проектов.
Добрый день, Alex!
Я QtCreator пользуюсь только, когда что то надо отлаживать под Linux, а так его никогда не использую.. Мне привычнее все делать в MS Visual Studio, я делаю проект для VC (qmake -t vcapp) и далее уже пишу код и отлаживаюсь в студии, или вообще в Far-manager пишу код и потом компилирую проект nmake в командной строке... Я думаю в данном случае это не принципиально. Я добавил qml в проект, но легче не стало.
выполнение qmake все равно приводит к описанному ранее предупреждению об отсутствии файлов. (WARNING: Failure to find: ..\3rdparty\zint-2.6.1\backend_qt4\qzint.cpp)
Повторюсь, qmake я вызываю из командной строки в консольном окне, в котором определены переменные окружения Visual Studio и QT.
Мне надо сначала добиться безошибочной работы qmake, а дальше уже все заработает без проблем :)
Я попробовал сейчас убрать из сборки zint (закомментировал в limereport.pri строку "CONFIG += zint"), qmake отработал без предупреждений, проект собрался, но при запуске приложения гуй дизайнера не появляется, процесс болтается в памяти..
-
Vermilion, Приветствую!
Добрый день, Alex!
Предыдущее сообщение было от dim0n-333 :)
По сути вопроса:
А вы после перехода на develop, перед сборкой проекта, очищали его ?
Крайне рекомендую грохнуть директории где происходит сборка и собрать по новой.
Использования qml можно избежать если использовать qtscriptengine вместо qjsengine
qml добавлен в силу того что qtscript теперь deprecated
Вы также можете собрать limereport как статическую либу и линковать к себе в проект CONFIG+= static_build
PS: Надеюсь ваш проект опенсорс в противном случае статическая линковка нарушает лицензионное соглашение ;)
-
Vermilion, Приветствую!
Добрый день, Alex!
Предыдущее сообщение было от dim0n-333 :)
По сути вопроса:
А вы после перехода на develop, перед сборкой проекта, очищали его ?
Крайне рекомендую грохнуть директории где происходит сборка и собрать по новой.
Использования qml можно избежать если использовать qtscriptengine вместо qjsengine
qml добавлен в силу того что qtscript теперь deprecated
Вы также можете собрать limereport как статическую либу и линковать к себе в проект CONFIG+= static_build
PS: Надеюсь ваш проект опенсорс в противном случае статическая линковка нарушает лицензионное соглашение ;)
Еще раз добрый день, Alex!
Прошу прощения у dim0n-333, с утра резкость не успел еще навести...
Да перед сборкой тупо все удаляю и делаю все с чистого листа.
По поводу статической сборки в курсе, стараемся не нарушать :-)
Ладно попробую другим путем пойти.. Спасибо за советы.
-
Vermilion, Я проверю линковку через pri если, что найду поправлю :)
Просто обычно используют линковку библиотеки, потому давно не проверял линковку через код.
-
Vermilion, Я проверю линковку через pri если, что найду поправлю :)
Просто обычно используют линковку библиотеки, потому давно не проверял линковку через код.
Спасибо Alex! Иногда нужно иметь монолитное приложение, которое за собой ничего не тянет, а только самую малость библиотек.. Так что, если у Вас будет такая возможность и время - гляньте.
-
Vermilion, Дык, если вы соберете статический лайм, он прекрасно влинкуется в приложение :)
-
Vermilion, Дык, если вы соберете статический лайм, он прекрасно влинкуется в приложение :)
Alex, да, тоже вариант. Но наверно все ж буду смотреть в сторону динамической сборки, так как под линухом все равно шареные объекты валяются.. и смысла в статической сборке там совсем нет.
-
Vermilion, Пофиксил qzint.pri, можно попробовать собрать, у меня вроде нормально собралось.
-
Vermilion, Пофиксил qzint.pri, можно попробовать собрать, у меня вроде нормально собралось.
Спасибо, Alex !
Будет чем заняться на праздники! С наступающим Всех!
-
Arin Alex, большое спасибо. Буду пробовать. Еще появился такой вопрос: в трех разных TextItem есть три разных числа (по одному в каждом). В четвертом нужно вывести сумму. Я пробовал закинуть каждое число в свою переменную (admin,support,service), а в четвертом айтеме их суммирую:
var total = service + admin + support;
numberFormat(total,"0,00","2","UK");
Но в итоге получается не прибавление чисел, а конкатенация строк: 0,000,0027,00
Как правильно сложить?
-
ldir, Приветствую!
Я изменил обработку свойства resourcePath в ImageItem терперь в нем можно использовать переменные и поля источников данных.
Что-то не могу разобраться, можно небольшой пример?
-
ldir, Приветствую!
1. сложить строки (limereport использует javascript): $S{parseFloat(value1)+parseFloat(value2)}
2. resourcePath:
например так resourcePath = $V{path}design.png, переменная path = "E:\Test Path\"
или так $V{path}$D{источник.поле_с_именем_картинки}
-
Arin Alex, спасибо! Все получилось.
-
Приветствую, Arin Alex!
Прошерстил весь форум, но что то не смог найти такого вопроса..
Мне нужно по-управлять в скрипте видимостью бордеров текстового итема. Строится табличка, в первом столбце я подавляю повторяющиеся значения. Возникла необходимость у текстового итема убрать горизонтальные границы пока значение повторяется.
Как только в первой колонке попадает новое значение, сверху у итема формируем снова горизонтальную линию и следующих строках снова проверяем повторение значения и выключаем, если требуется, бордер.
Проблема появляется на последней строке в таблице на каждой странице. Мне там надо по-любому нарисовать эту границу снизу.
Как в скрипте мне понять, что сейчас я работаю с последней строкой данных databand на текущей странице?
И еще один вопрос:
Подавление повторяющегося значение хорошо работает, как вы мне рекомендовали сделать, но тоже есть один момент, а именно:
Есть таблица и она заканчивается footer-ом. Если датабэнду установить признак "keep footer together" и последняя строка переносится с footer на следующую страницу, то AfterPageRender, который очищает переменную CustomerID - не отрабатыват и соответственно колонка с подавленным значением не печатает текст..
Если выключить "keep footer together", то получается что данные у меня на 1 странице а footer на второй, но без данных..
-
Vermilion, Приветствую!
Проблема с вашей задачей в том, что построитель отчета сам не знает о том, что это крайний банд на странице.
Тут дело в следующем - даже если банд поместился на странице, как вы сами заметили, он может переползти на другую страницу ряде случаев.
Подобные задачи возможно решить только на втором проходе, когда все страницы уже полностью сформированы.
На данный момент, к сожалению, обработка в скрипте второго прохода не реализована.
Я еще подумаю над этой задачей, возможно, решение будет найдено в рамках существующих возможностей.
-
Спасибо, Alex!
Буду ждать от Вас каких то вестей..
-
Такой вопрос, у меня в программе формируется картинка QPixmap, можно ли через переменную добавить ее в отчет?
-
Shookk69, Можно только не QPixmap а QImage для этого у QPixmap есть метод toImage()
-
Arin Alex, можете поподробней описать, у меня не получаетсья через переменную задать. Делал так, cоздал переменную
"m_report->dataManager()->setReportVariable("MapImage", m_clippedPixmap.toImage());",
далее захожу в дизайнер отчета, создаю ImageItem1 и в свойство variable записываю переменную $V{MapImage}, в предпросмотре отчета картинка не отрисовалась.
-
Shookk69, в свойстве variable просто имя переменной указывается без $V{} поскольку и так понятно, что это переменная
-
Arin Alex, заработало, спасибо большое)
-
Добрый вечер.
Собрал новую версию, но при сборке проекта, ошибка на скрине.
-
Проблема появилась после обновления Qt
-
yurii, Клирануть и собрать по новой пробовали?
-
Конечно. И не раз :)
-
yurii, Попробуйте снять галочку отладки QML в настройках сборки
-
Добрый день!
Создаю datasource из таблицы CSV. Вставляю диаграмму, указываю этот datasource. Всё работает.
Вставляю DataBand, переношу диаграмму туда, в рендере не показываются значения. Пробовал указывать и нет datasource для DataBand.
-
Dmitri, Пофиксил, пушнул
-
Спасибо!
-
Доброго времени суток.
Подскажите пожалуйста,как накинуть на pdf пароль?
Т.е защитить отчет от редактирования
-
Midzou, К сожалению limereport такую функцию не поддерживает.
-
добрый день
-возможен ли вывод отчета в html?
-можно ли подсоединяться к postrgesql?
-
Hugo,
-возможен ли вывод отчета в html?
В процессе разработки.
-можно ли подсоединяться к postrgesql?
Можно
-
Добрый день!
Вопрос по дизайнеру: Можно ли добавить новый бэнд (SubDetail) между другими? Или вообще как-то перемещать их?
Понадобилось добавить в имеющийся отчёт (уже навороченный) ещё одну таблицу. Естественно бэнд добавляется в конец, можно тупо копировать содержимое вышестоящих и вставлять в нижестоящие, тем самым "сдвинув" всё вниз, но это как-то... не по людски :)
-
ploop, Приветствую!
Видать сломал перетаскивание :) Поправлю.
-
ploop, Пофиксил (1.5.50). Можете проверять.
-
Ничего себе, как оперативно! Спасибо!
-
Пожалуй ещё спрошу: У ReportEngine есть метод printToPDF(fileName), который сохраняет результат в файл. А есть возможность сформировать PDF в QByteArray? На данный момент перебрасываю через файл, что не есть хорошо.
-
ploop, К сожалению, на данный момент так :) Подумаю, что можно с этим сделать :).
-
Привет
Только начал изучение LR.
Какие есть способы добавить изображение из кода(QPixmap\QImage)?
Пробовал засунуть QPixmap в таблицу, не работает :((в отчете не показывается, в таблице есть)
QTableWidgetItem * img = new QTableWidgetItem;
QPixmap pix = QPixmap(100,100);
pix.fill(Qt::red);
img->setData(Qt::DecorationRole, pix);
ui->tableWidget->setItem(2,2, img);
engine.dataManager()->addModel("tablewidget",ui->tableWidget->model(),false);
-
В отчете то какой элемент принимает картинку?
Есть Элемент изображение
-
В отчете то какой элемент принимает картинку?
Есть Элемент изображение
Есть. Но что в него передать не могу понять :)
Пробовал подцепить модель куда вставлена картинка и привязать к ImageItem - не хочет.
Вопрос такой: как можно вставить изображение НЕ из БД и НЕ с помощью прямого указания пути. По форуму искал, не нашел. В примерах как я понял все из БД, или косо смотрел...
-
Варианты:
Дважды кликни на элементе этом, расположенным на странице. Дальше довольно очевидно.
Или откуда необходимо вставить картинку? Поясни..
-
zzmiyy, Приветствую! Можно глянуть demo_r1 там oneslotds картинку передает.
-
zzmiyy, Приветствую! Можно глянуть demo_r1 там oneslotds картинку передает.
Отлично, примерно то что нужно. Буду копать. А кроме как колбеком из кода никак? Что еще почитать можно, чтобы понять как мне простейший отчет ( картинка + подпись)*n сделать? Подписи я так понял я могу закинуть все в модель одну и сразу все вывести. Или я не верно мыслю?
Варианты:
Дважды кликни на элементе этом, расположенным на странице. Дальше довольно очевидно.
Или откуда необходимо вставить картинку? Поясни..
Открывается окошко где меня просят указать путь к картинке. А у меня картинка сгенерирована и хранится в QImage. я могу ее конечно сохранить как файл, но очень не хотелось бы.
-
zzmiyy, Ну можно еще свою модель написать, но через калбек то проще, мне кажется :)
Что еще почитать можно, чтобы понять как мне простейший отчет (картинка + подпись)*n сделать?
Ну из доков только https://github.com/fralx/LimeReport/blob/master/docs/UserManualRu.pdf
P.S.
QStandardItemModel* testModel = new QStandardItemModel(3,1);
for (int i = 0; i<3; ++i){
QStandardItem* img_item = new QStandardItem("");
img_item->setData( QImage(":/report//images/logo32"), Qt::DisplayRole);
testModel->setItem(i, 0, img_item);
testModel->setItem(i, 1, new QStandardItem(QString("img_item_%1").arg(i)));
}
report->dataManager()->addModel("Test_Model", testModel, true);
Вот такое еще можно сколхозить
-
Спасибо, то что нужно! Мануал посмотрел, но там заполнение из бд, что мне не подходит.
Пытаюсь заполнить данными из модели и столкнулся с абсолютным непониманием работы.
QStandardItemModel* tst = new QStandardItemModel(10,2); //тестовая модель
for(int i=0; i< tst->rowCount();i++){
tst->setItem(i,0,new QStandardItem(QString("%1").arg(i))); //заполняем
tst->setItem(i,1,new QStandardItem(QString("%1").arg(i*i)));
}
ui->tableView->setModel(tst); //добавил в tableView для проверки
engine.dataManager()->addModel("tst", tst,false); //добавляем модель напрямую
engine.dataManager()->addModel("tst1", ui->tableView->model(),false); //добавляем модель, вытащенную из вьюхи. По логике должно быть одно и тоже?
Иии... нет. Что я делаю не так?) Скрины вывода и шаблона прикрепил.
UPD: Самое смешное:
engine.dataManager()->addModel("tst", view->model(),false); //эта строчка выводит ток нули
engine.dataManager()->addModel("tst1", view->model(),false); //а эта строчка работает...
engine.dataManager()->addModel("tst", tst,true); //не работает
engine.dataManager()->addModel("tst1", tst,true);//работает
Если поменять местами - ничего не меняется...
Работает только с названием tst1...
-
Открывается окошко где меня просят указать путь к картинке. А у меня картинка сгенерирована и хранится в QImage. я могу ее конечно сохранить как файл, но очень не хотелось бы.
[/quote]
Как раз с Алексом обсуждали. Передай в переменную отчета картинку.
Как то так:
QIMage image=...;
QVariant variant=image;
report->setReportVariable(variable,variant);
-
Как раз с Алексом обсуждали. Передай в переменную отчета картинку.
Как то так:
QIMage image=...;
QVariant variant=image;
report->setReportVariable(variable,variant);
Спасибо, так тоже получилось.
-
zzmiyy,
Работает только с названием tst1...
Вы положили на один DataBand два источника данных, DataBand может управлять перемещением по записям только одного источника, указанного в свойстве "datasource" у DataBand. Таким образом, вы перемещаетесть по tst1 и там значения меняются, а tst стоит на первой записи где все значения равны 0.
-
Понял, спасибо.
-
Привет.
Видел, что есть возможность добавлять оглавление. А как? На форуме не увидел примера :(
-
Что именно ты имеешь ввиду под Оглавлением?
-
Заголовок раздела - страница.
Тут в 7ом пункте: http://limereport.ru/forum/index.php?topic=3.msg1721#msg1721
-
Ну это у Алекса надо спросить :)
Возможно имелось ввиду setReportName или setPreviewWindowTitle
давно уже было, сложно вспомнить, что там было. Боюсь, и Алекс не вспомнит :)
P.S. может, что-то из области tableOfContents
-
А...
Сообразил, band - заголовок отчета имеется ввиду.
Band, который печатается один раз, на старте всего отчета
-
zzmiyy, Можете глянуть demoReport1_report_header_group_subdetail_TOC.lrxml там оно есть :)
еще можно глянуть https://youtu.be/9tVicuuTWFc там есть расхождения с существующей реализацией, но общий принцип тот же.
-
Arin Alex, Пробую заполнить все точно так же как в примере, но из модели( addTableOfContentsItem(getField("model.column"), getField("model.column")); ). В ТоС добавляется только первый элемент. Что может быть не так?
-
zzmiyy, А можно сам отчетик глянуть ?
-
Arin Alex, например вот.
Еще у меня всегда кнопка "Удалить страницу" неактивна, так и должно быть?
-
zzmiyy, На странице оглавления у банда должен быть укакзан источник данных = tableofcontents
Еще у меня всегда кнопка "Удалить страницу" неактивна, так и должно быть?
Странно, должна быть активной (в случае если страниц отчета больше одной).
-
Arin Alex, Разобрался, спасибо.
А мне нигде не дает удалить репорт пейдж...
Почему элементы внутри одного лейаута могут быть "перемешаны"? Можно как-то отключить это?
Отчет на 81 страницу с кучей картинок отказался сохраняться в пдф(при нажатии на кнопку принт просто ничего не происходит)? Как фиксить?
-
zzmiyy, не сохраняется в pdf - странно. Попробуй костыль сделать, поставь pdf-принтер какой-нить, Bullzip например. Посмотри, как там. Скорее всего там не то, что не сохраняет, а долго рендерит и ты не дожидаешься. Но это предположение.
-
Subst, Да с этим пока не важно, позже разберусь.
Меня сильно огорчает, что перемешиваются внутри лейлаута объекты.
Структура такая: есть лейаут, в нем несколько лейаутов, в каждом картинка + подпись. И вот некоторые перемешиваются, то есть идут не по порядку как в модели. Это происходит при смене страницы.
На рисунке пример что я имею ввиду.
А на счет невозможности удалить страницу:
Не дает, пока не создам новую. После кнопка становится активной.
-
zzmiyy, Правильно ли я понимаю, что с кнопкой удаления, последовательность действий такая:
report->loadFromFile(fileName);
report->designReport();
И в этом случае кнопка удаления страницы не активна?
Про перемешивание лейаутов не совсем понятно, можно сам файл отчета кинуть?
-
Arin Alex, Да, последовательность именно такая.
В связи с тем, что сначала я не догадался как автоматически нумеровать подписи к рисункам, я вставлял номер рисунка в подпись, а подписи хранил в модели. В первой картинке сам лейаут с элементами и модель с данными. На второй результат рендера и сохранения в ПДФ. Возможно я опять что-то пропускаю мимо...
Как нумеровать из шаблона я придумал, сейчас попробую, надеюсь что-то изменится.
-
Arin Alex, изменил, вставляю номер картинки из скрипта, не помогло. Прикрепленный пик. Теперь дело точно не в модели ;D
-
zzmiyy, А можно все таки сам lrxml глянуть? Его можно мне на почту arin_a@bk.ru кинуть.
-
Arin Alex
Прикрепил шаблон.
Вот код для заполнения модели похожими данными:
QStandardItemModel * model = new QStandardItemModel();
for(int i = 0; i<3; i++){
QList<QStandardItem *> items;
for(int j=0;j<8;j++){
items << new QStandardItem(""); //skip fields
}
for(int j=0;j<10;j++){
items << new QStandardItem("sample text");
QStandardItem * b = new QStandardItem("");
QPixmap pix = QPixmap(1200,600);
pix.fill(QColor(qrand()%255,qrand()%255,qrand()%255));
b->setData(pix.toImage(), Qt::DisplayRole);
items << b;
}
items << new QStandardItem("sample text");
model->appendRow(items);
}
reporter.dataManager()->addModel("allData", model, true);
-
zzmiyy, Ага спасибо гляну
-
zzmiyy, Быстрый способ поправить ситуацию - грохнуть объемлющий лаяут. Но случай интересный на досуге поковыряю :)
-
zzmiyy, Нашел баг, пофиксил, пушнул (1.5.75).
-
Arin Alex, Спасибо!
Есть возможность как-то увеличить время удержания клавиши мыши для drag-n-drop`а? Часто простым кликом(возможно только у меня правда) что-то чуть-чуть сдвигается.
-
@zzmiyy, не только у вас :)
-
zzmiyy, MultiMote, По просьбам трудящихся добавил небольшую задержку перед измерением положения и размеров :)
P.S. А еще геометрию можно лочить используя Ctr+L и обратно через Ctrl+Shift+L.
-
Спасибо!
-
Arin Alex, А какие возможности есть у скриптового языка? Только те функции, что перечислены Functions?
А то я тут подумал, что передаю кучу всяких полей внутрь через поля DataSource, а мог бы передать одной структурой на подобии JSON. Возможно ли такое?
-
zzmiyy, язык JavaScript можете и JSON пихнуть
-
Народ! Ну как сделать ценники? Чтоб несколько в ряду)) А то я последний раз году в 2017 делал, но так и не осилил)) В демках нету - этож самый популярный вид отчета должен быть))
-
leoneii, Ну как то так :)
-
leoneii, Ну как то так :)
Попробую завтра, спасибо))
-
не получилос(((
-
Ааааа, все, простите, я тупой, датасорс не выбрал новый, все заработало
-
Воть ;)
-
А чтож, здрасте, есть готовая функция суммы прописью?
-
В интернете полно :) Можно javascript пихнуть
Вот например
num2str = (function (){var money;
var price;
var rub, kop;
var litera = sotny = desatky = edinicy = minus = "";
var k = 0, i, j;
N = ["", "один", "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять",
"", "одиннадцать", "двенадцать", "тринадцать", "четырнадцать", "пятнадцать", "шестнадцать", "семнадцать", "восемнадцать", "девятнадцать",
"", "десять", "двадцать", "тридцать", "сорок", "пятьдесят", "шестьдесят", "семьдесят", "восемьдесят", "девяносто",
"", "сто", "двести", "триста", "четыреста", "пятьсот", "шестьсот", "семьсот", "восемьсот", "девятьсот",
"тысяч", "тысяча", "тысячи", "тысячи", "тысячи", "тысяч", "тысяч", "тысяч", "тысяч", "тысяч",
"миллионов", "миллион", "миллиона", "миллиона", "миллиона", "миллионов", "миллионов", "миллионов", "миллионов", "миллионов",
"миллиардов", "миллиард", "миллиарда", "миллиарда", "миллиарда", "миллиардов", "миллиардов", "миллиардов", "миллиардов", "миллиардов"];
var M = new Array(10);
for (j = 0; j < 10; ++j)
M[j] = new Array(N.length);
for (i = 0; i < N.length; i++)
for (j = 0; j < 10; j++)
M[j][i] = N[k++]
var R = new Array("рублей", "рубль", "рубля", "рубля", "рубля", "рублей", "рублей", "рублей", "рублей", "рублей");
var K = new Array("копеек", "копейка", "копейки", "копейки", "копейки", "копеек", "копеек", "копеек", "копеек", "копеек");
function num2str(money) {
if (typeof money == "number") {money = money.toString();}
rub = "", kop = "";
money = money.replace(",", ".");
if (isNaN(money)) {
return "Не числовое значение";
}
if (money.substr(0, 1) == "-") {
money = money.substr(1);
minus = "минус "
}
else minus = "";
money = Math.round(money * 100) / 100 + "";
if (money.indexOf(".") != -1) {
rub = money.substr(0, money.indexOf("."));
kop = money.substr(money.indexOf(".") + 1);
if (kop.length == 1) kop += "0";
}
else rub = money;
if (rub.length > 12) {
return "Слишком большое число";
}
ru = propis(price = rub, R);
ko = propis(price = kop, K);
ko != "" ? res = ru + " " + ko : res = ru;
ru == "Ноль " + R[0] && ko != "" ? res = ko : 0;
kop == 0 ? res += " ноль " + K[0] : 0;
return (minus + res).substr(0, 1).toUpperCase() + (minus + res).substr(1);
}
function propis(price, D) {
litera = "";
for (i = 0; i < price.length; i += 3) {
sotny = desatky = edinicy = "";
if (n(i + 2, 2) > 10 && n(i + 2, 2) < 20) {
edinicy = " " + M[n(i + 1, 1)][1] + " " + M[0][i / 3 + 3];
i == 0 ? edinicy += D[0] : 0;
}
else {
edinicy = M[n(i + 1, 1)][0];
(edinicy == "один" && (i == 3 || D == K)) ? edinicy = "одна" : 0;
(edinicy == "два" && (i == 3 || D == K)) ? edinicy = "две" : 0;
i == 0 && edinicy != "" ? 0 : edinicy += " " + M[n(i + 1, 1)][i / 3 + 3];
edinicy == " " ? edinicy = "" : (edinicy == " " + M[n(i + 1, 1)][i / 3 + 3]) ? 0 : edinicy = " " + edinicy;
i == 0 ? edinicy += " " + D[n(i + 1, 1)] : 0;
(desatky = M[n(i + 2, 1)][2]) != "" ? desatky = " " + desatky : 0;
}
(sotny = M[n(i + 3, 1)][3]) != "" ? sotny = " " + sotny : 0;
if (price.substr(price.length - i - 3, 3) == "000" && edinicy == " " + M[0][i / 3 + 3]) edinicy = "";
litera = sotny + desatky + edinicy + litera;
}
if (litera == " " + R[0]) return "ноль" + litera;
else return litera.substr(1);
}
function n(start, len) {
if (start > price.length) return 0;
else return Number(price.substr(price.length - start, len));
}
return num2str;
})()
-
Охох, спасибо! Я сначала в программулине написал класс, ну как написал, взял отсюда и переделал - http://www.prog.org.ru/topic_7629_0.html
А потом до меня дошло, что в программе нигде нету суммы! В смысле можно выполнить запрос, но зачем? И до меня дошло второй раз, что Alex выложил готовый скрипт для lreport)) Работает))
-
Эсть ли возможность создания отчета только программным путем? Без различных манипуляций с бэндами и размещением в ник соотвутствующих данных. Если есть готовые примеры изпользования LimeReport, прошу поделиьься пожалуйста.
-
Доброе время суток!
Имеется отчет с данными и некоторым pagefooter, на котором
размещены некоторые текстовые поля и картинки. Высота pagefooter
стоит например 50 мм. У pagefooter установлен признак автоматической
высоты. Строим отчет, данные заполняют все свободное пространство
до pagefooter. Хотим начиная со второй страницы изменить размер pagefooter
например кодом в скрипте:
Reportpage1.beforeRender.connect(ReportPage1BeforeRender)
function ReportPage1BeforeRender(){
if ( getVariable("#PAGE") != 1 ){
Reportpage1_ShapeItem1.isVisible = false;
Reportpage1_ImageItem62.isVisible = false;
ReportPage1_PageFooter1.setItemHeight(0);
} else {
Reportpage1_ShapeItem1.isVisible = true;
Reportpage1_ImageItem62.isVisible = true;
}
}
В результате видим, что начиная со второй страницы pagefooter стал невидимый,
но данные, которые выводятся на второй странице и далее заполняют не все свободное
пространство, а то, что было доступно по высоте на первой странице.
Перепробовал разные варианты свойств и бэндов и элементов отчета, не получается
заставить данные использовать все освободившееся пространство на второй и далее
страницах.
Куда копать.. подскажите!
Заранее благодарен за советы.
-
Так сказать вдогонку..
Печатать или не печатать нижний колонтитул не в этом вопрос, задача именно в изменении его размера на разных страницах, в частности
на первой странице делаем его большим, а на остальных страницах делаем его меньше, главное чтобы вывод данных учитывал новый размер
нижнего колонтитула. Может есть какие то другие подходы в репортере, но я не нашел подходящего механизма.
-
Vermilion, Приветствую.
Проверил ваш скрипт у себя. Вроде на первый взгляд работает как вы и хотите.
На приложенном скрине видно, что на второй странице данные заняли больше места чем на первой
У pagefooter установлен признак автоматической высоты
Для футера не очень хорошо работает, дойдут руки уберу это свойство из футера :)
-
Alex, Приветствую!
Я вот примерчик сделал, у меня не получается добиться такого же результата, как у вас.
Взял последнюю версию репортера, Qt 5.7.1x64
Пытался еще играться размером футора, но результат такой же..
Заранее благодарен.
-
Vermilion, У вас ошибочка в скрипт закралась :)
Reportpage1.beforeRender.connect(ReportPage1BeforeRender)
function ReportPage1BeforeRender(){
if ( getVariable("#PAGE") != 1 ){
Reportpage1_ShapeItem1.isVisible = false;
ReportPage1_PageFooter1.setItemHeight(1);
Должно быть
Reportpage1_PageFooter1.setItemHeight(1)
}
}
Если исправить будет вот так
-
Alex, спасибо за подсказку, проглядел... Слишком понадеялся на автокод :)
Буду дальше смотреть.
Спасибо за помощь.
-
Добрый день!
Передаю в отчёт модель QTableWidget.Таблица на экран просмотра выводится.Теперь надо в одной колонке сделать шрифт жирным в зависимости от значения в другой колонке. Я так понимаю, значения являются текстовыми. Значит надо преобразовать в численные , сравнить и назначить шрифт в зависимости от результата сравнения.
Не подскажете как это сделать, либо где посмотреть пример?
-
Добрый!
Вообще, скриптами.
В Demo Есть change_item_from_script
здесь, примерно на эту же тему
https://limereport.ru/forum/index.php?topic=419.0
тут тоже рядом
https://limereport.ru/forum/index.php?topic=417.0
-
Добрый день!
Ещё есть один вопрос: можно ли в окне Preview спрятать кнопку редактирования отчёта?
Ну, и если можно, все остальные кроме печати.
-
Можно вообще сделать свое окно предварительного просмотра со своими кнопками и дополнительным функционалом.
Для этого есть класс LimeReport::PreviewReportWidget, и кажется даже есть пример.. в демках
-
yumb, Vermilion,
все верно сказал Vermillon
стандартное окно предпросмотра оно на то и стандартное.
для кастомизации есть
PreviewReportWidget* ReportEngine::createPrevieScene(QWidget *parent), которую можно поместить на любой виджет, кнопки к которому приделать самому.
можно еще посмотреть
PreviewReportWidget* ReportEngine::createPreviewWidget(QWidget *parent)
а непосредственно по заданному вопросу, и коротким путем. Ответ далее:
void ReportEngine::setSaveToFileVisible(bool value)
void ReportEngine::setResultEditable(bool value)
void ReportEngine::setPrintToPdfVisible(bool value)
void ReportEngine::setPrintVisible(bool value)
-
проститеизвините
Как сумму (SUM) по таблице узнать, если нет DataBand на этой странице отчета?
-
куча вариантов
запрос к БД сделать
скрипт прифигачить
встроенная функция у Алекса есть
-
что за функция? Я сделал датасорс новый, запрос, можно вообще из приложения передать. Но тем не менее.
-
Еще, еще вопрос/просьба -дайте родительного падежа скрипт))
-
никто меня не любит))
-
leoneii,
Еще, еще вопрос/просьба -дайте родительного падежа скрипт))
Тут я не понял про что вопрос :)
Как сумму (SUM) по таблице узнать, если нет DataBand на этой странице отчета?
1. Передать сумму из приложения
2. Написать скрипт который сумму будет считать
3. Если есть дата DataBand на другой странице, можно сумму прикопать в переменную, потом использовать :)
Походу нужен вебинар как пользоваться скриптами в лайме :)
-
Здравствуйте, есть задача генерировать отчёты в формате PDF на сервере. Отчёты должны состоять из таблиц, графиков/рисунков и текстовых полей. Отчёты должны строиться по данным, присылаемым на сервер, данные одинаковы по структуре, но число столбцов таблиц может варьироваться. При этом форма отчёта должна быть создана один раз, к ней только применяются значения.
1) С помощью LR можно создавать отчёты в консольном приложении? Я так понял, что структура отчёта хранится в xml-файле и его можно один раз отладить в дизайнере, а потом использовать в других проектах?
2) Будут ли таблицы, которые я поместил в PDF, обладать свойствами pdf-таблицы (т.е. смогу ли я копировать оттуда значения, не будет ли это просто картинка)?
-
Drummmerz,
С помощью LR можно создавать отчёты в консольном приложении? Я так понял, что структура отчёта хранится в xml-файле и его можно один раз отладить в дизайнере, а потом использовать в других проектах?
Можно создавать консольные приложения (есть определенные нюансы если рассматривать линукс сервера)
Пример консольного приложения имеется в исходниках.
Будут ли таблицы, которые я поместил в PDF, обладать свойствами pdf-таблицы (т.е. смогу ли я копировать оттуда значения, не будет ли это просто картинка)?
На выходе limereport создает обычные pdf с возможностью копирования текста.
-
Arin Alex,
Большое спасибо :)
-
leoneii,
Еще, еще вопрос/просьба -дайте родительного падежа скрипт))
Тут я не понял про что вопрос :)
Походу нужен вебинар как пользоваться скриптами в лайме :)
Давай вебинар!!))
Родительный падеж нужен в договорах - в бд руководитель Иванов Иван Иванович, а в договоре - в лице ИваноВА ИванА ИвановичА, вот о чем речь. Может кто делал))
-
leoneii,
Вот модифицированный под лайму petrovich (https://github.com/petrovich/petrovich-js (https://github.com/petrovich/petrovich-js))
Юзать на свой страх и риск :)
-
И снова здравствуйте :)
Вопрос по использованию QImage/QPixmap в качестве переменной отчёта. Нашёл несколько топиков на эту тему, но так и не понял, как правильно добавлять.
Как это делаю я:
class LogoPixmap : public QPixmap
{
public:
LogoPixmap(QSize size) : QPixmap(size) {
fill(Qt::white);
QPaintEvent *pe = new QPaintEvent(rect());
paintEvent(pe);
delete pe;
}
protected:
void paintEvent(QPaintEvent *event)
{
QSvgRenderer svgRenderer(QString(":/images/images/logo.svg"));
svgRenderer.setAspectRatioMode(Qt::KeepAspectRatio);
QPainter svgPainter(this);
svgRenderer.render(&svgPainter, rect());
}
};
...
logoPixmap = new LogoPixmap(QSize(150, 50));
QVariant logoImage(*logoPixmap);
report->dataManager()->setReportVariable("LogoImage", logoImage);
logoPixmap->save("logo_pixmap.png"); // проверяю, что изображение нарисовалось
На картинке то, как инициализирую изображение в дизайнере.
-
На картинке то, как инициализирую изображение в дизайнере.
Поправочка, мало заскринил
-
Drummmerz, Приветствую!
Свойство variable должно содержать значение LogoImage без $V{}, потому как и так понятно, что это переменная.
-
здрасте, а как передать путь к бд в источник данных?
-
Здравствуйте.
1) Как сделать так, чтобы андерлайн под лэйаутом не съедался самими итемами? Причем так съедается, что от приближения зависит, насколько андерлайн виден, на скринах показал разницу.
2) Как сделать, чтобы adaptFontToSize одинаково ресайзил? На скрине видно, что строки в одном и том же столбце одинаковой длины, но шрифт иногда где-то больше, где-то меньше. Есть ли возможность функцией самому адаптировать шрифт, потому что, допустим, мне надо, чтобы шрифт везде был одинаковый, а текст в каждом текстовом поле может быть разной длины.
3) Есть ли возможность адаптировать число текстовых полей в лэйауте? Я кидаю в отчёт TableModel, у которого может варьироваться число столбцов. Как можно указать отчёту, что число столбцов переменное, и чтобы он их ужимал под ширину страницы. А если есть возможность, то и поворачивать на определённый угол (из существующих) некоторые поля.
-
leoneii, Можно использовать переменную
-
Drummmerz,
Как сделать так, чтобы андерлайн под лэйаутом не съедался самими итемами?
Можно в меня кинуть шаблон? например на arin_a@bk.ru. По описанию не совсем понятно о чем речь.
Как сделать, чтобы adaptFontToSize одинаково ресайзил
Можете сами прописать алгоритм подбора шрифта в зависимости от длинны
$S{
var color = LimeReport.color('#DEB887');
var font = LimeReport.font('Times New Roman',26,false,true);
THIS.backgroundColor = color;
THIS.fontColor = LimeReport.color('red');
THIS.font = font;
'Test'}
Есть ли возможность адаптировать число текстовых полей в лэйауте?
Можно скрывать столбец по определенному условию
$S{ if (getVariable("COL_COUNT")==2) THIS.isVisible = false }
Для того, что бы горизонтальная группировка сохраняла размер, layoutType нужно установить в Table
-
leoneii, Можно использовать переменную
не получилось. в свойствах подключения сделал переменную, где путь. Ну да ладно - дефолтконнекшенс работает)
-
Arin Alex,
Можно в меня кинуть шаблон? например на arin_a@bk.ru. По описанию не совсем понятно о чем речь.
Я отправил, вы пока не отвечаете, так что отпишу ещё сюда, мб в спам попало ;D
-
Всем доброго дня.
Возможно комуто информация окажется полезной, т.к. у меня на понимание этого ушло некоторое время.
Мне потребовалось в качестве источника данных в отчете использовать существующую модель (QSqlTableModel), подключенную к QTableView. Программа, над которой я работаю, включает поддержку нескольких языков UI. Для заполнения заголовков QTableView я использую model()->setHeaderData(..).
Но вот засада - LimeReport для идентификации колонок, в источнике данных, использует названия из заголовка модели. Соответсвенно при смене языка UI меняется и текст в заголовках таблицы, в результате отчет не может сформироваться корректно.
Я не нашел описания этого момента в документации. Путем анализа исходников библиотеки LimeReport выяснилось - первым делом она пытается получить название колонки используя Qt::UserRole, если это название пустое, тогда библиотека берет название из Qt::DisplayRole.
Нехитрый код помогает избежать казусов с переключением языка UI и сменой названий колонок:
for(int i=0; i < model->record().count(); i++) {
model->setHeaderData(i, Qt::Horizontal, model->headerData(i, Qt::Horizontal, Qt::DisplayRole), Qt::UserRole);
}
-
Полезно :)
Но с задержкой лет на 5-6 :)
Этот вопрос возникал, кажется, весной 2016 года впервые
-
И снова здравствуйте!
Можно ли в LimeReport динамически создавать элементы в бэндах (в скрипте или из Qt части)? А то у меня монструозные таблицы, на 20+ столбцов и в редакторе для каждого создавать тело, вставлять скрипт и менять поля очень долго, да и не особо гибко, поменяется один столбец где-то в середине, нужно будет идти и руками править.
И можно ли вызвать как-нибудь список элементов в бэнде? Допустим у меня те же 20+ столбцов и я в скрипте им подгоняю размеры, как мне надо, хотелось бы это сделать в цикле, но к ним доступ только прямо по называнию элемента, приходится прописывать всё вручную.
Кстати, Arin Alex, спасибо за скрипт, но это не то, что мне нужно было, посчитать число символов в элементе недостаточно для определения ширины, даже если использовать и в качестве пропорции относительно всей ширины листа, потому что символы занимают место по разному. Я в итоге стал переменной закидывать размеры элементов для произвольного шрифта и уже их в скрипте использовать как аргументы пропорции.
-
вот это выражение -
...Цена договора составляет $S{currencyFormat($D{summ.SUM(sum)},'RU')} ( $S{num2str($D{summ.SUM(sum)})} ) , и включает в себя...
Толи из-за дефолтконнекшенс, толи из-за виндавс - не работает (на изначальном компе с линупс все ок)
Скобки не нравятся, пишет - ...договора составляет
SyntaxError: Expected token `)' ( SyntaxError: Expected token `)' ) , и включает в себя...
-
Drummmerz, На данный момент нет. Можно было бы написать api для фабрик объектов, но на данный момент со свободным временем совсем плохо.
-
leoneii, Можно в меня кинуть lrxml (arin_a@bk.ru) я гляну
-
можно, сек. С домена info, сразу в спаме ищите))
99% оно просто не видит бд. Но весь остальной отчет заработал с defaultconnection
-
Drummmerz, Еще, как вариант, lrxml это просто xml, можно его создать в дизайнере а потом дополнять столбцами в коде.
-
Приветствую! Вроде вопрос простой, но ответа не нашел.
Возможно ли сделать вертикальную группировку в строках с данными? На картинке во вложении будет понятно, о чём я.
-
прием прием, чокак, не смотрели?))
-
Добрый день. Пробуем ваш продукт и не получается найти решение:
У дата-бэнда есть свойство columnCount, как проверить в ходе формирования отчета, в какой колонке сейчас идет печать? columnIndex где-то брезжит привлекательным миражем, но доступиться не получается.
-
Добрый день. Пробуем ваш продукт и не получается найти решение:
У дата-бэнда есть свойство columnCount, как проверить в ходе формирования отчета, в какой колонке сейчас идет печать? columnIndex где-то брезжит привлекательным миражем, но доступиться не получается.
Навскидку видится только вариант с переменной и скриптами в колонках.
Т.е. в каждой колонке прописать скрипт, который будет присваивать переменной номер. Или увеличивать счетчик.
Не копал глубоко щас, некогда, это так с ходу. Но зато железно, гвоздями.
Может Алекс присоединится, может что ему в голову прийдет
-
кхе кхе))
нихто миня ни любитт)
-
кхе кхе))
нихто миня ни любитт)
ну хотя бы прицепи отчет тут
с датасоурсом, есессена
-
А по группировке, случайно, никто не подскажет? Работа стоит... :)
-
А по группировке, случайно, никто не подскажет? Работа стоит... :)
хай!
тебе проще всего датасоурс сделать соответственно желаниям. Т.е. select с group by нарисовать
-
ploop, Смержить ячейки не получится, но можно просто скрывать повторяющиеся значения.
-
leoneii, К сожалению, в данный момент, временя остается только на то чтоб иногда поспать :(. Как только выйду в нормальный режим работы, обещаю отвечать активнее :)
-
hobbit2100, На данный момент эта информация скриптам недоступна. А для чего это Вам нужно?
-
тебе проще всего датасоурс сделать соответственно желаниям. Т.е. select с group by нарисовать
Дык в примере как раз он :) Вопрос именно в объединении строк датабэнда по вертикали по определённому признаку. Если это не реализовано специально, то костыли вряд ли помогут.
ploop, Смержить ячейки не получится, но можно просто скрывать повторяющиеся значения.
Понял, спасибо! Повторы и на SQL скрыть можно, оставив одно значение, но оно будет в какой-то конкретной строке.
-
кхе кхе))
-
Открывается окошко где меня просят указать путь к картинке. А у меня картинка сгенерирована и хранится в QImage. я могу ее конечно сохранить как файл, но очень не хотелось бы.
Как раз с Алексом обсуждали. Передай в переменную отчета картинку.
Как то так:
QIMage image=...;
QVariant variant=image;
report->setReportVariable(variable,variant);
Здравствуйте! У меня такая же проблема, делаю по вашему примеру не получается.
QPixmap p = ui->Plot2->toPixmap(480,240);
QVariant variant=p;
m_report.dataManager()->setReportVariable("qwer", variant);
В самом шаблоне отчета мне переменную qwer надо привязать к какому объекту? TextItem? Не работает(
-
BigM, Приветствую! Изображения выводятся через ImageItem
-
У меня новая напасть- не печатает на реальной виндавс 10. В смысле ничего не происходит при нажатии на кнопку печати)) На вин7 в виртуал-бокс- диалог выбора принтера нормально открывается
-
смотрите еще что - а куда выложить формы упд, счета, договора? Мало ли, всем же нужны, я ослеп одну УПД рисовать))
На гитхаб может?
-
Здравствуйте, подскажите, пожалуйста, как лучше сделать, чтобы выводить названия столбцов в начале каждой страницы отчета и при этом еще на самой первой странице в самом начале вывести заголовок отчета. Если названия столбцов я закреплю в pageHeader, чтобы они повторялись на каждой странице, то заголовок отчета из reportHeader получается будет ниже названия столбцов? Или можно сделать как-нибудь проверку на номер страницы и не показывать pageHeader с названиями столбцов для первой страницы, а запихнуть названия столбцов дял первой страницы под названием заголовка в reportHeader?
-
1. ReportHeader можно расположить ДО PageHeader. Смотри скрин прицепленный
2. Есть переменная $V{Page} - это номер страницы. Также в скрине показал.
-
Subst, спасибо, работает.
-
Здравствуйте, не подскажите в чем может быть проблема? Печатается только первая страница отчета. Табличные данные просто идут до конца первой страницы, даже под номером страницы, а вторая страница не появляется. Вот шаблон и скриншот проблемы.
-
Здравствуйте, не подскажите в чем может быть проблема? Печатается только первая страница отчета. Табличные данные просто идут до конца первой страницы, даже под номером страницы, а вторая страница не появляется. Вот шаблон и скриншот проблемы.
Сам датосоурс приложить можно?
-
Subst, к сожалению нет. Но методом пошагового удаления частей шаблона, я нашел, что ошибка кроется в horizontallayout в main data band. Если я удаляю его, то печать переходит на вторую и последующие страницы, но весь шаблон конечно "едет". Нашел на этом форуме похожую проблему, там она решалась выставлением для horizontallayout поля itemlocation в band, вместо page. Но у меня и так уже стоит band.
Вот так устанавливаю датасорс
report = new LimeReport::ReportEngine(this);
QSqlQueryModel* captionModel = new QSqlQueryModel(this);
captionModel->setQuery(QString("SELECT * FROM fn_report_captions() t;"));
QSqlQueryModel* mainModel = new QSqlQueryModel(this);
mainModel->setQuery(QString("SELECT * FROM fn_reports() t;"));
report->dataManager()->addModel("main", mainModel, true);
report->dataManager()->addModel("caption", captionModel, true);
report->loadFromFile(templateFileName);
report->setShowProgressDialog(true);
QPrinter printer(QPrinter::HighResolution);
printer.setOutputFileName(lFileName);
report->printReport(&printer);
-
Вот так выглядит, если удалить горизонтальный лейаут в главном бенде.
-
Subst, к сожалению нет. Но методом пошагового удаления частей шаблона, я нашел, что ошибка кроется в horizontallayout в main data band. Если я удаляю его, то печать переходит на вторую и последующие страницы, но весь шаблон конечно "едет". Нашел на этом форуме похожую проблему, там она решалась выставлением для horizontallayout поля itemlocation в band, вместо page. Но у меня и так уже стоит band.
Ясно.
Ну без данных мне нечем заполнить отчет.
Что попробовать придумать, соответсвенно, я так же не имею возможности.
Тупо нет возможности тестировать.
-
Subst,
Вот база для SQLite mydb.db.
Будет правда всего 4 столбца (даже 3).
Чтобы подключить, нужно создать два источника данных:
main SELECT * FROM main;
caption SELECT * FROM caption;
Попробовал на винде (до этого был на линуксе) и с дргуим источником данных (SQLite, до этого был postgres), проблема остается.
И даже еще появилась новая проблема (при малом количестве столбцов заметил): столбцы стали меняться местами (должны идти в порядке (1, 2, 24), а идут (2, 24, 1).
Информация по БД:
CREATE TABLE main (fio varchar(20), c1 varchar(8), c2 varchar(8), c24 varchar(8));
INSERT INTO main VALUES('Ivanov','22:33:44','33:55"11','33:55:12');
.
.
.
INSERT INTO main VALUES('Ivanov13','22:33:44','33:55"11','33:55:12');
CREATE TABLE caption (c1 varchar(2), c2 varchar(2), c24 varchar(2), zc1 integer, zc0 integer);
INSERT INTO caption VALUES('1','2','24',2,1);
В таблице main данные для основной части отчета.
В таблице caption данные об именах столбцов и их количестве.
В шаблоне столбцы: фамилия, всего и еще от 0 до 30 столбцов с однообразными данными. Эти 30 столбцов в двух группах (Группа А и группа Б). В группу А могут входить столбцы с 1 по 23. В группу Б с 24 по 30.
В данном случае в таблице main 2 столбца из группы А c1 varchar(8 ), c2 varchar(8 ) и один столбец из группы Б c24 varchar(8 ).
В таблице caption столбец zc1 integer содержит информацию о том, сколько в данном случае столбцов в группе А (в данном случае 2), а столбец zc0 integer ту же информацию, но о группе Б (в данном случае 1). Ориентируясь на значения zc1 и zc0, шаблон скрывает лишние столбцы, изменяет размеры заголовков с названиями групп, и изменяет ширину данных из reportheader. (Вот тут еще появилась ошибка при маленьком количестве столбцов, они меняются местами).
Также в caption хранятся названия столбцов:
c1 varchar(2), c2 varchar(2), c24 varchar(2).
-
а from_date и to_date для полнооты картины?
из программы задаются?
-
мимоходом...
для доступа к полю таблицы можно так делать
$D{table_name.field_name}
так короче и удобней
-
а from_date и to_date для полноты картины?
из программы задаются?
ага.
мимоходом...
для доступа к полю таблицы можно так делать
$D{table_name.field_name}
так короче и удобней
да просто у меня была функция на javascripte в одном из прошлых отчетов, и она должна была преобразовывать значения полей из БД, поэтому я использовал такую форму. А так как на основе того отчета, делал этот отчет, такой формат получения данных остался, хотя он здесь и не нужен.
-
От части понял в чем проблема: при переходе (переносе данных отчета) на следующую страницу не учитывается информация о динамически изменившейся высоте элементов, как в заголовках, которые находятся в репорт хеадере, так и в основной таблице с данными в дата бэнде (которые в horizontal layout). Генератор отчетов, видимо, рассчитывает, сколько строк из таблицы уместится на одной странице, учитывая только заданные изначально размеры. Т.е. высота строки изначально была 5 mm в таблице с данными и 10 mm в заголовках таблицы. Но с реальными данными эта высота увеличивается в несколько раз. В итоге, генератор считает, что n-ое количество строк поместится на одной странице, но они, увеличившись по высоте, выходят за ее пределы. Временно решил эту проблему увеличением изначальных высот строк в шаблоне до максимальной возможной (какую они смогут принимать). Правда тогда строки, в которых объемных (в высоту) данных нет, занимают даром много места на странице отчета.
А вторую проблему с самопроизвольным перескакиванием столбцов пока не решил. Правда заметил, что столбцы поменялись местами только в шапке. Т.е. поменялись только заголовки (c2, c24, c1) вместо (c1, c2, c24), а столбцы в дата бэнде идут в правильном порядке (c1, c2, c24)
-
eustace,
От части понял в чем проблема: при переходе (переносе данных отчета) на следующую страницу не учитывается информация о динамически изменившейся высоте элементов
Генератор заранее не вычисляет количество строк, а наполняет элементами до полного заполнения пространства. Единственный элемент, который вычисляется заранее это футер страницы, вот он не способен кардинально менять свой размер. Ваш случай надо исследовать отдельно. Если вы сможете подготовить тестовые данные и прислать мне на почту (Arin_a@bk.ru) я попробую найти время и глянуть. Ваша задача хорошо решается через кросс таблицы, но в лайме на данный момент такой элемент не реализован.
-
Здравствуйте Arin Alex, спасибо, отправил вам на почту. Продублирую тут тоже.
mydb.db - файл БД SQLite с тестовыми данными.
template.lrxml - шаблон отчета.
test2.sql - файл дампа БД (на всякий случай).
-
Arin Alex, форумчане, доброго времени!
Подскажите, я правильно понял, что limereport не воспринимает стандартный xml файл, только свой формат lrxml через loadFromFile()?
Перечитал форум еще раз, уже будучи зарегистрированным (смог смотреть вложения), показалось, что теперь более менее разобрался как работать с LimeReport...
Укажите, если не прав, пожалуйста:
1. Создаем модель
2. Заполняем модель данными (?)
3. Открываем дизайнер отчетов с подключенной моделью и делаем шаблон отчета, сохраняем его
report->dataManager()->addModel("test123", model, true);
report->designReport();
4. Теперь можно без открытия дизайнера, сразу вызывать превью (при условии подключенной модели и загруженного шаблона)
report->dataManager()->addModel("test123", model, true);
report->loadFromFile("D:/projects/test_rpt_lemon/build-test_rpt_lemon-Desktop_Qt_5_12_10_MinGW_64_bit-Debug/123.lrxml");
report->previewReport();
-
И, еще один вопрос)
Пытаюсь сформировать в дизайнере шаблон отчета для таблицы, нужно получить что-то очень похожее на то, что изображено на скрине (прикрепил)
У меня не получается сделать такой формат заливок фона, я нашел не весь функционал, или действительно нельзя так сделать?
Помимо заливок фона интересует в целом вывод таблицы со всем вытекающим: настройка толщины границ ячеек и прочее. Видимо нельзя?
-
Снова вопросы. Можно ли добавленную модель данных QStringListModel вывести в отчете не по вертикали, а по горизонтали? Мне нужно список данных вывести по горизонтали, не могу разобраться, возможно ли это...
-
Lex,
Снова вопросы. Можно ли добавленную модель данных QStringListModel вывести в отчете не по вертикали, а по горизонтали? Мне нужно список данных вывести по горизонтали, не могу разобраться, возможно ли это...
Я по горизонтали это как :) Можно пример?
Помимо заливок фона интересует в целом вывод таблицы со всем вытекающим: настройка толщины границ ячеек и прочее. Видимо нельзя?
В limereport как таковое понятие таблицы отсутствует, таблица собирается из ячеек содержащих данные, соответственно на скриптах можно реализовать довольно разнообразное отображение этих ячеек
1. Создаем модель
2. Заполняем модель данными (?)
3. Открываем дизайнер отчетов с подключенной моделью и делаем шаблон отчета, сохраняем его
4. Теперь можно без открытия дизайнера, сразу вызывать превью (при условии подключенной модели и загруженного шаблона)
В целом, да :)
-
Arin Alex,
Я по горизонтали это как :) Можно пример?
Да, конечно, приложил
...соответственно на скриптах можно реализовать довольно разнообразное отображение этих ячеек
А можно немного подсказки, где почитать про скрипты? А то я пока только на форуме поиском нашел немного инфы по ним, но этого определенно мало :)
Получается с помощью скриптов можно запретить выводить все данные ячейки? Например, попросить вывести только первое значение ячейки данных, либо только N-е.
Еще есть подозрения на баг, либо мое непонимание. При настройке бэнда (databand) устанавливаю ему галочки на все границы (мне надо что бы бэнд был в рамке), однако ячейка с данными, находящаяся внутри этого бэнда, так же окружается рамками, при чем каждое поле этой ячейки :( Приложил в закрепе
Спасибо за ответ!
-
Друзья, подскажите, пожалуйста, как можно с помощью скриптов настроить дизайн отображения данных? Задать фон у ячейки, да так что бы на первом элементе данных был один фон, на втором - другой, на третьем - третий и т.д. Перерыл весь форум и, как-то нет ответов, только вопросы по типу моего.
-
А че посмотреть в исходниках лаймы??
\demo_r1\demo_reports\change_item_from_script.lrxml
var color = LimeReport.color('#DEB887');
THIS.backgroundColor = color;
-
Subst, спасибо большое!
Теперь знаю где смотреть. Только код смотрел, папку с шаблонами не замечал даже...
Сам глуп, спасибо за ответ, еще раз!
P.S. и все же, как выбрать не по значению строки, а именно по позиции значения?
что-то типа: if ($D{customers.CustomerID}.position == 4)
{
'<span style="background:black; color:red; font-weight:bold ">' + $D{customers.CustomerID} + '</span>'
}
UPD:
Сделал вот таким способом, оставлю тут, вдруг кому понадобится:
$S{
if (line('DataBand1') == 4)
{
'<span style="background:black; color:red; font-weight:bold ">' + $D{customers.CustomerID} + '</span>'
}
else
{
$D{customers.CustomerID}
}
}
-
Lex, Приветствую ! Отвечаю с большими задержками :( Шибко много работы и слишком мало времени :(
Еще есть подозрения на баг, либо мое непонимание. При настройке бэнда (databand) устанавливаю ему галочки на все границы (мне надо что бы бэнд был в рамке), однако ячейка с данными, находящаяся внутри этого бэнда, так же окружается рамками, при чем каждое поле этой ячейки :(
Возможно проблема в масштабировании попробуйте вывести на печать или увеличить масштаб.
Для организации таблиц удобно использовать горизонтальную группировку и границы выставлять у самих ячеек, впрочем, у самой группировки это тоже можно сделать.
В качестве лайфхака: в инициализационном скрипте можно инициализировать переменные и потом использовать их в обработчиках событий генератора и при отрисовке элементов.
Инициализационный скрит
var c_line = 1
function afterRender(){
c_line ++
}
Reportpage1_DataBand1.afterRender.connect(afterRender)
Отрисовка
$S{
switch(c_line){
case 1:
THIS.backgroundColor = LimeReport.color("#ff4d94")
break
case 2:
THIS.backgroundColor = LimeReport.color("#809fff")
break
case 3:
THIS.backgroundColor = LimeReport.color("#66ffc2")
break
}
c_line
}
Пример отчета во вложении
-
Приветствую!
Подскажите пожалуйста, как сделать отчет следующего вида:
(http://report.png)
- отчет строится на данных из модели данных
- каждая запись определяет тип отображения данных в строке
- ячейки в строке могут объединяться в зависимости от типа строки
- данные, которые попадают в отображение, имеют переменную длину и ячейки могут расширяться
Я пробовал делать так:
для объеденных ячеек в дата-бэнд помещал длинные TextItem поверх элементов для каждого столбца и
потом в "Скрипте" управлял видимостью всех TextItem-s в зависимости от типа строки.
Отчет как то рисовался, но вот с размерами TextItem по высоте происходила какая то чехарда
у всех элементов стоит автоматическая высота и растягивать до максимальной высоты,
некоторые элементы не растягивались до максимума, а некоторые рисоваться начинали не с самого верха, хотя у бэнда
выключен признак "сохранять отступ сверху"
Может нужно не так делать такие отчеты? Подскажите куда копать..
-
Vermilion Приветствую, можно поиграться с лаяутами. Для примера сделал шаблончик
-
Vermilion Приветствую, можно поиграться с лаяутами. Для примера сделал шаблончик
Приветствую Alex! Спасибо за идею, попробую..
-
Приветствую!
Что то не собирается master.. Пробовал на 5.11.3 x64 (MSVS 2015), 5.7.1 (MSVS 2015)
упирается в одном и том же месте:
cl -c -nologo -Zc:wchar_t -FS -Zc:strictStrings -Zc:throwingNew -O2 -MD -GR -W3 -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 -wd4577 -wd4467 -EHsc -DUNICODE -DWIN32 -DWIN64 -DLIMEREPORT_EXPORTS -DHAVE_S
VG -DHAVE_REPORT_DESIGNER -DHAVE_ZINT -DLIMEREPORT_VERSION_STR=\"1.6.8\" -DHAVE_QT5 -DHAVE_UI_LOADER -DUSE_QJSENGINE -DHAVE_REPORT_DESIGNER -DHAVE_QTDESIGNER_INTEGRATION -DINSPECT_BASEDESIGN -DQT_NO_DEBUG -DQT_SVG
_LIB -DQT_UITOOLS_LIB -DQT_PRINTSUPPORT_LIB -DQT_DESIGNERCOMPONENTS_LIB -DQT_DESIGNER_LIB -DQT_UIPLUGIN_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_XML_LIB -DQT_SQL_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DNDE
BUG -D_WINDLL -I. -Idialogdesigner\3rdparty\qtcreator\designerintegrationv2 -Idialogdesigner\3rdparty\qtcreator -Idialogdesigner\3rdparty\designer -Iobjectinspector -Idatabrowser -I. -Iitems -Ibands -Ibase -Iscrip
teditor -I..\3rdparty\zint-2.10.0\backend -I..\3rdparty\zint-2.10.0\backend_qt -IC:\Qt\Qt5.7.1\5.7\msvc2015_64\include -IC:\Qt\Qt5.7.1\5.7\msvc2015_64\include\QtSvg -IC:\Qt\Qt5.7.1\5.7\msvc2015_64\include\QtUiTool
s -IC:\Qt\Qt5.7.1\5.7\msvc2015_64\include\QtPrintSupport -IC:\Qt\Qt5.7.1\5.7\msvc2015_64\include\QtDesignerComponents -IC:\Qt\Qt5.7.1\5.7\msvc2015_64\include\QtDesignerComponents\5.7.1 -IC:\Qt\Qt5.7.1\5.7\msvc2015
_64\include\QtDesignerComponents\5.7.1\QtDesignerComponents -IC:\Qt\Qt5.7.1\5.7\msvc2015_64\include\QtDesigner\5.7.1 -IC:\Qt\Qt5.7.1\5.7\msvc2015_64\include\QtDesigner\5.7.1\QtDesigner -IC:\Qt\Qt5.7.1\5.7\msvc2015
_64\include\QtDesigner -IC:\Qt\Qt5.7.1\5.7\msvc2015_64\include\QtUiPlugin -IC:\Qt\Qt5.7.1\5.7\msvc2015_64\include\QtWidgets\5.7.1 -IC:\Qt\Qt5.7.1\5.7\msvc2015_64\include\QtWidgets\5.7.1\QtWidgets -IC:\Qt\Qt5.7.1\5
.7\msvc2015_64\include\QtWidgets -IC:\Qt\Qt5.7.1\5.7\msvc2015_64\include\QtGui\5.7.1 -IC:\Qt\Qt5.7.1\5.7\msvc2015_64\include\QtGui\5.7.1\QtGui -IC:\Qt\Qt5.7.1\5.7\msvc2015_64\include\QtGui -IC:\Qt\Qt5.7.1\5.7\msvc
2015_64\include\QtANGLE -IC:\Qt\Qt5.7.1\5.7\msvc2015_64\include\QtXml -IC:\Qt\Qt5.7.1\5.7\msvc2015_64\include\QtSql -IC:\Qt\Qt5.7.1\5.7\msvc2015_64\include\QtQml -IC:\Qt\Qt5.7.1\5.7\msvc2015_64\include\QtNetwork -
IC:\Qt\Qt5.7.1\5.7\msvc2015_64\include\QtCore\5.7.1 -IC:\Qt\Qt5.7.1\5.7\msvc2015_64\include\QtCore\5.7.1\QtCore -IC:\Qt\Qt5.7.1\5.7\msvc2015_64\include\QtCore -Iwin64\release\moc -Iwin64\release\ui -IC:\Qt\Qt5.7.1
\5.7\msvc2015_64\mkspecs\win32-msvc2015 -Fowin64\release\obj\ @C:\Users\AVP\AppData\Local\Temp\nm62F7.tmp
lrdatabrowser.cpp
c:\temp\limereport-master\limereport\lrcollection.h(48): error C2433: COLLECTION_TYPE_ID: "inline" не разрешается для объявлений данных
lrsqleditdialog.cpp
c:\temp\limereport-master\limereport\lrcollection.h(48): error C2433: COLLECTION_TYPE_ID: "inline" не разрешается для объявлений данных
lrconnectiondialog.cpp
c:\temp\limereport-master\limereport\lrcollection.h(48): error C2433: COLLECTION_TYPE_ID: "inline" не разрешается для объявлений данных
Создание кода...
NMAKE : fatal error U1077: "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\amd64\cl.EXE" : возвращенный код "0x2"
Stop.
NMAKE : fatal error U1077: "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\amd64\nmake.exe" : возвращенный код "0x2"
Stop.
NMAKE : fatal error U1077: cd : возвращенный код "0x2"
Stop.
-
Уверен, что Qt 5.11.3 ??
А вот компалер мне дает понять иное:
-IC:\Qt\Qt5.7.1\5.7\msvc2015_64\include\QtGui\5.7.1\QtGui
ниче не смущает? :)
ну это как минимум, у тебя там в путях на винде где и что прописано? версии не микшируются ли?
-
Уверен, что Qt 5.11.3 ??
А вот компалер мне дает понять иное:
-IC:\Qt\Qt5.7.1\5.7\msvc2015_64\include\QtGui\5.7.1\QtGui
ниче не смущает? :)
ну это как минимум, у тебя там в путях на винде где и что прописано? версии не микшируются ли?
Да нет, я сначала пробовал на 5.11.3, потом на 5.7.1 - поведение одинаковое, скрин из последней попытки :) (переменные окружения для каждого Qt устанавливаются свои - микс исключен)
Сборка прошла только develop - тут все чисто
-
Да, действительно, с точки зрения MSVC вот это
const int inline COLLECTION_TYPE_ID = qMetaTypeId<ACollectionProperty>();
нехорошо
отписал Алексу
Попробуй при сборке указать компилятору /std: c++17
-
Vermilion, Поправил, можно проверять.
-
Спасибо Alex! Все собралось. И спасибо за наводку про лайауты - удалось мудреную печатную форму сделать! :)
-
Приветствую, Alex!
Примерчик мудреного отчета. Все в нем хорошо, есть небольшой косяк в отображении выбранного в режиме дизайна лайаута
(рисуется какой то артефакт слева вверху).
Это, как говорится, "на скорость не влияет", но может поправить.. для красоты :)
-
Извините за глупые вопросы, не получается выделить жирным шрифтом текстовое поле,в которое помещена текстовая переменная, в зависимости от значения другой булевой переменной. Можно ли это сделать в тексте значения поля или надо делать снаружи в скрипте? И если не трудно, может пример есть?
-
Доброго времени суток.
Я пытаюсь собрать limereport.pro под Ubuntu 22.
Я установил Qt6.4, открыл проект, снял флаг "теневая сборка".
При компиляции возникает следующая ошибка: cannot find -lxkbcommon: No such file or directory,
хотя пакет libxkbcommon-x11-0 самой новой версии (1.4.0-1) установлен.
Благодарен за любую помощь.
-
Извините за глупые вопросы, не получается выделить жирным шрифтом текстовое поле,в которое помещена текстовая переменная, в зависимости от значения другой булевой переменной. Можно ли это сделать в тексте значения поля или надо делать снаружи в скрипте? И если не трудно, может пример есть?
как-то так
$S{
if ($V{var}==true)
"<b>klop</b>";
else
"klop";
}
-
shurakubrak, Приветствую, я так подозреваю, что не хватает пакета libxkbcommon-dev.
-
При создании приложения QT утилитой windeployqt перестал вызываться диалог печати в просмотре. Кнопка не реагирует на нажатие. limereport.dll лежит рядом с exe-шником. Из среды QTCreator печать работает. Что куда добавить подскажите пожалуйста.
-
рядом есть апка
printsupport
?
-
Есть папка printsupport и plugins с dll-ками.
Забыл уточнить: это происходит на другом компе, при переносе приложения.
Установил QT на другой комп и печать пошла.
Надо искать теперь отличия. Хотелось бы печатать без среды программирования.
-
ну очень похоже на нехватку плугинов
что рядом с программой лежит в сборке?
скрин сделай чтоль
-
Изначально папок plagins и printsupport не было. Взял из проекта LimeReprotDesiner. Но не помогло.
-
Не понял по поводу "взял из проекта"
Почему не взял из сборки Qt ?
-
Добавил папку c:\Qt\...\plugins\printsupport из сборки QT к папкам приложения.
И правда помогло. Теперь печать работает.
Спасибо за подсказку!
-
ю а велкам
-
How to split data into columns vertically?
Have datasource with 5-10 items and want to split it to 2 columns verticaly:
1 4
2 5
3 6
But receive
1
2
3
4
5
6
columnFillDirection = Vertical
If I select VerticalUniform that recieve just:
4
5
6