Welcome, Guest. Please login or register.
Did you miss your activation email?

Author Topic: Вопросы новичка  (Read 151306 times)

Ender X

  • Newbie
  • *
  • Posts: 2
    • View Profile
Re: Вопросы новичка
« Reply #165 on: September 07, 2018, 12:34:51 pm »
День добрый.

Есть заполненная QStandardItemModel.

По коду:
Code: [Select]
report = new LimeReport::ReportEngine(this);
    report->dataManager()->addModel("model", model, true);
    report->designReport();
исправно выводит дизайнер отчёта.

А вот по коду:
Code: [Select]
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

Subst

  • Sr. Member
  • ****
  • Posts: 450
    • View Profile
Re: Вопросы новичка
« Reply #166 on: September 07, 2018, 02:57:32 pm »
Ender X, ты уверен, что по заданному пути точно есть твой шаблон отчета?
Если он лежит рядом с исполняшкой (exe файлом), укажи явно

report->loadFromFile(qApp->applicationDriPath()+"/report.lrxml");

Ender X

  • Newbie
  • *
  • Posts: 2
    • View Profile
Re: Вопросы новичка
« Reply #167 on: September 07, 2018, 03:15:53 pm »
Ender X, ты уверен, что по заданному пути точно есть твой шаблон отчета?
Если он лежит рядом с исполняшкой (exe файлом), укажи явно

report->loadFromFile(qApp->applicationDriPath()+"/report.lrxml");

Спасибо! Помогло.  :)

Kilek

  • Newbie
  • *
  • Posts: 8
    • View Profile
Re: Вопросы новичка
« Reply #168 on: November 20, 2018, 12:07:44 pm »
Здравствуйте, я новичок в qt, поэтому не могли бы вы обьяснить мне кое что. Я смог подключить LimeReport как библиотеку к своему проекту, при нажатии на кнопку я запускаю LimeReport :
LimeReport::ReportEngine m_report;
m_report.designReport();
Вопрос, как мне передать значения в отчёт не из бд, а из моей программы, грубо говоря я имею объект с тремя свойствами и хочу передать их в отчёт в виде таблицы.
Возможно вопрос глупый, но буду крайне признателен за разжеванный ответ, спасибо.

Arin Alex

  • Developer
  • Administrator
  • Hero Member
  • *****
  • Posts: 1005
    • View Profile
Re: Вопросы новичка
« Reply #169 on: November 20, 2018, 09:33:07 pm »
Kilek Приветствую!
В limereport можно передавать
 1. переменные 
 
Code: [Select]
  report->dataManager()->setReportVariable(ui->leVariableName->text(), ui->leVariableValue->text());
 
2. Источники данных унаследованные от QAbstractItemModel
 
Code: [Select]
  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

Останутся вопросы пишите.

Kilek

  • Newbie
  • *
  • Posts: 8
    • View Profile
Re: Вопросы новичка
« Reply #170 on: November 22, 2018, 12:05:50 pm »
Alex, спасибо за ответ, есть ещё два вопроса. Возможно ли из моей программы задавать шаблон, что бы пользователю открывался сразу готовый отчёт в LimeReport даже без необходимости нажатия на Render.
 И есть ли механизм задания параметров для создания отчёта. Например, LimeReport принимает поле даты, но выводить будет только информацию за последний месяц.

Arin Alex

  • Developer
  • Administrator
  • Hero Member
  • *****
  • Posts: 1005
    • View Profile
Re: Вопросы новичка
« Reply #171 on: November 22, 2018, 03:41:06 pm »
Kilek
report->loadFromFile(fileName);
report->dataManager()->setReportVariable("VarName", "VarValue");
Можно установить переменные и потом в отчете формировать запросы с использованием этих значений.
report->preview() // Для вызова окна просмотра
report->print() // Для вывода на печать
report->printToPDF("FileName") // Печать в PDF

Kilek

  • Newbie
  • *
  • Posts: 8
    • View Profile
Re: Вопросы новичка
« Reply #172 on: November 23, 2018, 05:59:59 pm »
  Я пытаюсь открыть файл 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, но я не особо шарю, что там к чему(

Arin Alex

  • Developer
  • Administrator
  • Hero Member
  • *****
  • Posts: 1005
    • View Profile
Re: Вопросы новичка
« Reply #173 on: November 23, 2018, 07:43:45 pm »
Kilek
Если вместо previewReport() вызвать designReport(), что открывается ? Дизайнер показывает шаблон отчета?
« Last Edit: November 23, 2018, 07:46:00 pm by Arin Alex »

Kilek

  • Newbie
  • *
  • Posts: 8
    • View Profile
Re: Вопросы новичка
« Reply #174 on: November 26, 2018, 11:22:21 am »
Всё разобрался, как всегда сам тупил)
« Last Edit: November 26, 2018, 12:59:10 pm by Kilek »

Kilek

  • Newbie
  • *
  • Posts: 8
    • View Profile
Re: Вопросы новичка
« Reply #175 on: November 26, 2018, 06:21:22 pm »
Ну а выборку возможно делать только непосредственно подготавливая передаваемые значения в моём коде. В LimeReport нет возможности задать параметры для принимаемых значений? Просто, если я сделаю, к примеру, критерий по необходимой дате, а в другой ситуации программа не будет работать с датой, тогда придётся переписывать код, получается очень не универсально. Или всё-таки есть способ красиво обыграть данную ситуацию?

Arin Alex

  • Developer
  • Administrator
  • Hero Member
  • *****
  • Posts: 1005
    • View Profile
Re: Вопросы новичка
« Reply #176 on: November 26, 2018, 08:45:47 pm »
С данными, грубо говоря, есть два сценария:
  1. limereport сам подготавливает данные, то есть на основании переменных строит запросы к БД и т.д.
  2. Данные подготавливает внешнее приложение, и в этом случае они должны быть полностью готовы к использованию генератором отчетов.
В новой версии (develop ветка на github) можно управлять процессом генерации отчета посредством скриптов и, в зависимости от условия, предотвращать генерацию раздела, таким образом, по сути, осуществить фильтрацию. Вопрос эффективности в этом случае остается открытым, поскольку генератору отчетов придется перебрать все переданные записи, и если на выход уйдет, к примеру, 1% от переданного объема, то время ожидания формирования отчета может не соответствовать результату. Таким образом данные целесообразнее подготовить заранее для максимально быстрой генерации отчета.   
 

Kilek

  • Newbie
  • *
  • Posts: 8
    • View Profile
Re: Вопросы новичка
« Reply #177 on: November 28, 2018, 01:13:11 am »
Ок понятно, спасибо за ответ

Kilek

  • Newbie
  • *
  • Posts: 8
    • View Profile
Re: Вопросы новичка
« Reply #178 on: December 04, 2018, 03:12:57 pm »
Добрый день, если использовать callback datasources, то как передавать туда мои данные? К примеру у меня есть QVector, каждый элемент которого это объект класса, имеющий 4 параметра. Каким образом я могу адекватно представить их в отчете. С шаблоном и как показывать понятно, вопрос, как передать вектор в ColumnData?
case LimeReport::CallbackInfo::ColumnData:
   date =  info.columnName + “ “ + QString::number(info.index);

Я сначала пытался преобразовать вектор в QVariant и просто присвоить date, но так не работает, получается, что я вывожу одно значение во все колонки. Сейчас я думаю, что нужно передавать информацию в info. Но знаний и опыта у меня мало, так что решил спросить у вас.

Arin Alex

  • Developer
  • Administrator
  • Hero Member
  • *****
  • Posts: 1005
    • View Profile
Re: Вопросы новичка
« Reply #179 on: December 04, 2018, 05:10:59 pm »
Добрый день.
Если у вас есть массив объектов с некоторыми свойствами,
и вам из этого нужно получить табличное представление,
то следует сделать следующее :

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;

Вот собствено и все :)
« Last Edit: December 04, 2018, 06:41:57 pm by Arin Alex »