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

Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Messages - Dark2011

Pages: 1 [2]
16
Есть разные программные модули - у каждых своя модель...
Есть один синглтон-принтер - внутри которого LimeReport::ReportEngine*;

У этого принтера есть вот такой вот метод

Code: [Select]
  void create_report(QAbstractItemModel* data, QString report_templte)
  {
        if(data && !report_templte.isEmpty())
        {
            const QString REPORT_MODEL_NAME = "table_model";

            if(m_report->dataManager()->containsDatasource(REPORT_MODEL_NAME))
                m_report->dataManager()->removeModel(REPORT_MODEL_NAME);
            m_report->dataManager()->addModel(REPORT_MODEL_NAME, data, true);
            if(!m_report->loadFromFile(report_templte))
            {
                qDebug() << "Wrong report template";
                return;
            }

            int debug_mode = 0;  // TODO we need to get it from global settings object
            if(debug_mode)
            {
                //m_report->setShowProgressDialog(false);
                m_report->designReport();
            }
            else m_report->previewReport();
        }
        else
        {
            if(!data) qDebug() << "Wrong data: nullptr";
            if(report_templte.isEmpty()) qDebug() << "Wrong report template: path is empty";
        }
    }

Печатаю отчет из одного модуля - все ок!
Печатаю из другого - удаляю старую модель       
Code: [Select]
      if(m_report->dataManager()->containsDatasource(REPORT_MODEL_NAME))
                m_report->dataManager()->removeModel(REPORT_MODEL_NAME);

далее устанавливаю новую - падает
Code: [Select]
      m_report->dataManager()->addModel(REPORT_MODEL_NAME, data, true);

Баг или я что то не то делаю?

Версия LM master с github от вчерашнего дня)

17
объясните мне пожалуйста как работать с qrc ресурсами
 Arin Alex - в твоем примере ты используеш основной ресурс lm (report.qrc),
если я хочу использовать свой ресурс - как это сделать?

18
Да, и при том данные правильные

19
Значится так.... Проверял я все это дело с тем что в мастере на гите.
Если данные устанавливать вот так ( пример demo_r1 в конструкторе) :

Code: [Select]
    wgt = new QTableWidget(3, 4);
    wgt->setItem(0, 0, new QTableWidgetItem("Test1"));
    wgt->setItem(0, 1, new QTableWidgetItem("Test2"));
    wgt->setItem(0, 2, new QTableWidgetItem("Test3"));
    wgt->setItem(0, 3, new QTableWidgetItem("0"));
    ........
    и тд
    ........
    report->dataManager()->addModel("table_model",wgt->model(),true);
   
 
то все пучком - скрипт норм работает
скрипт:
Code: [Select]
$S{
if ($D{table_model.4}!="0")
  "<img src='/home/dark2011/workspace/LimeReport/demo_r1/images/tick.png'>"
else
  ""
}

но если делать через сигнально-слотовое соединение вот так:

Code: [Select]
    LimeReport::ICallbackDatasource * callbackDatasource = report->dataManager()->createCallbackDatasouce("table_model");
    connect(callbackDatasource, SIGNAL(getCallbackData(LimeReport::CallbackInfo,QVariant&)),
                   this, SLOT(slotGetCallbackData(LimeReport::CallbackInfo,QVariant&)));

    connect(callbackDatasource, SIGNAL(changePos(const LimeReport::CallbackInfo::ChangePosType&,bool&)),
                    this, SLOT(slotChangePos(const LimeReport::CallbackInfo::ChangePosType&,bool&)));

    /*  report->dataManager()->addModel("table_model",wgt->model(),true);  */

и определять слоты slotGetCallbackData и slotChangePos ну и соотв метод prepareData (все из demo_r1)
Code: [Select]
void MainWindow::prepareData(QTableWidget* wgt, LimeReport::CallbackInfo info, QVariant &data)
{
    switch (info.dataType)
    {
        case LimeReport::CallbackInfo::ColumnCount:
            data = wgt->columnCount();
            break;
        case LimeReport::CallbackInfo::IsEmpty:
            data = !(wgt->item(0, 0));
            //data = !ds->first();
            break;
        case LimeReport::CallbackInfo::HasNext:
            //data = true;
            break;
        case LimeReport::CallbackInfo::ColumnHeaderData:
            data = info.index + 1;
            //if (info.index < ds->record().count())
            //    data = ds->record().fieldName(info.index);
            break;
        case LimeReport::CallbackInfo::ColumnData:
        {
            if(current_row != info.index)
            {
                current_row = info.index;
                column_counter = 0;
            }
            else ++column_counter;
            //qDebug() << "Current index: " << info.index;
            QTableWidgetItem* currentItem = wgt->item(current_row, column_counter);
            if(currentItem)
            {
                qDebug() << "Test data: " << currentItem->text();
                data = currentItem->text();
//                if(column_counter  != 3)
//                    data = currentItem->text();
//                else
//                {
//                    QIcon testIcon(":/images/images/tick.png");
//                    data = qVariantFromValue(testIcon);
//                    //data = qvariant_cast<QIcon>(testIcon);
//                }
            }
            break;
        }
    }
}

void MainWindow::slotGetCallbackData(LimeReport::CallbackInfo info, QVariant &data)
{
    if (!wgt) return;
        prepareData(wgt, info, data);
}

void MainWindow::slotChangePos(const LimeReport::CallbackInfo::ChangePosType &type, bool &result)
{
    if( (type == LimeReport::CallbackInfo::First) && (current_pos != 0) )
        current_pos = 0;

    if( current_pos < wgt->rowCount() )
    {
        result = true;
        current_pos++;
    }
    else result = false;
}
то ресурсы в этом скрипте данных действительно нет т.к теперь даже в else нету данных, хотя если вместо этого написать $D{table_model.4} - это работает
Code: [Select]
$S{
if ($D{table_model.4}=="0")
 "<img src='/home/dark2011/workspace/LimeReport/demo_r1/images/tick.png'>"
else
  $D{table_model.4}
}

сорян за длинные пути к иконкам - так и не посмотрел пока как аттачить ресурсы....
Да и Arin Alex - твоя демка работает когда есть ресур - а когда нет синтакс еррор

в общем в атаче исходники
 





[вложение удалено администратором]

20
Спокуха:) До компа если доберусь сеня выложу, нет - так с утречка....)
Там весь исходник считай это ваша демо1, тока я там все потер и вместо это QTableWidget заполнил
и юзал его модель.... смотри код первого поста
Ошибка при использовании скрипта, данные из модели доступны
Скачал из гита последнюю версию завтра буду собирать пробовать

21
кинь отчет, чет фигня какая-то. Откуда синтакс  еррор
Прикрепил

QtScript собран?
Если да, то следующий вопрос - LM собран с поддержкой Script ?
QtScript собран, LM - без понятия
А версия собрана с гитхаба ? Если да то с какой ветки ?
Версия с sourceforge та что 1.3.11.7z весит 3.5мб :)

Qt 5.7 gcc 4.8.4




[вложение удалено администратором]

22
Вот пример работает в демке demo_r1

У меня выдает syntax error

23
$S{
if($D{table_model.4}=='0')
     "<img src='/home/dark/Pictures/Icons/chip_1.png'>" ;
else
    "";
    }

ну вот так вроде

зачем у тебя скобки фигурные дважды?
{$D{table_model.4}}=='0'  - вот тут

потому что без них у меня syntax error,
специально вот еще раз проверил

24
Dark2011, Ресурсы поддерживает

а как)?

Ребят не могу понять как оператор сравнения работает.
В коде:
     ............
     wgt->setItem(0, 3, new QTableWidgetItem("0"));
     wgt->setItem(1, 3, new QTableWidgetItem("1"));
     wgt->setItem(2, 3, new QTableWidgetItem("2"));
     ............
     
Если просто $D{table_model.4} выводит все правильно (0, 1, 2), а с условием все время в else попадает
$S{
if({$D{table_model.4}}=='0')
"<img src='/home/dark/Pictures/Icons/chip_1.png'>"
else ""
}

25
Все сделал - спасибо - нужно было установить галочку allowHTML

А ресурсы qt-ые не поддерживаются?

26
Условие работает а вот картинку не грузит(
$S{
if({$D{table_model.4}})
"<img src='/home/dark/Pictures/Icons/chip1.png'>"
else " "
}

отображается как <img src='/home/dark/Pictures/Icons/chip1.png'>

27
Добрый день.

Есть табличная модель. В зависимости от данных в одной из колонок должна отображаться та или иная иконка
(если не ноль то галочка если ноль то крестик или ничего)
В приложении эту роль играет делегат. Как подобный функционал осуществить здесь?

Когда я просто устанавливал модель все данные отображаются нормально, но каким образом в IconItem установленной в  DataBand отображать ту или иную иконку в зависимости от значений я не понял - это вообще возможно?... TextItem же я так понял никакую иконку установить тоже не может - это чисто текст;
Code: [Select]
... где то в конструкторе
my_model = new MyTestTableModel(this);
report->dataManager()->addModel("table_model",my_model, true);


Попробовал другим путем (для примера взял QTableWidget) - в slotGetCallbackData в нужной колонки устанавливаю иконку из ресурсов (просто для теста а не из конретного айтема)

Code: [Select]
MainWindow::MainWindow(QWidget *parent) :  QMainWindow(parent),
    ui(new Ui::MainWindow), m_progressDialog(0)
{
    ui->setupUi(this);
    report = new LimeReport::ReportEngine(this);

    connect(report, SIGNAL(renderStarted()), this, SLOT(renderStarted()));
    connect(report, SIGNAL(renderPageFinished(int)),
            this, SLOT(renderPageFinished(int)));
    connect(report, SIGNAL(renderFinished()), this, SLOT(renderFinished()));

    wgt = new QTableWidget(3, 4, this);
    wgt->setItem(0, 0, new QTableWidgetItem("Test1"));
    wgt->setItem(0, 1, new QTableWidgetItem("Test2"));
    wgt->setItem(0, 2, new QTableWidgetItem("Test3"));
    wgt->setItem(0, 3, new QTableWidgetItem("0"));
    .... и тд.

      LimeReport::ICallbackDatasource * callbackDatasource = report->dataManager()->createCallbackDatasouce("table_model");
    connect(callbackDatasource, SIGNAL(getCallbackData(LimeReport::CallbackInfo,QVariant&)),
            this, SLOT(slotGetCallbackData(LimeReport::CallbackInfo,QVariant&)));

    connect(callbackDatasource, SIGNAL(changePos(const LimeReport::CallbackInfo::ChangePosType&,bool&)),
            this, SLOT(slotChangePos(const LimeReport::CallbackInfo::ChangePosType&,bool&)));
}

void MainWindow::slotGetCallbackData(LimeReport::CallbackInfo info, QVariant &data)
{
    if (!wgt) return;
        prepareData(wgt, info, data);
}

void MainWindow::prepareData(QTableWidget* wgt, LimeReport::CallbackInfo info, QVariant &data)
{
    switch (info.dataType)
    {
        case LimeReport::CallbackInfo::ColumnCount:
            data = wgt->columnCount();
            break;
        case LimeReport::CallbackInfo::IsEmpty:
            data = !(wgt->item(0, 0));
            break;
        case LimeReport::CallbackInfo::HasNext:
            //data = true;
            break;
        case LimeReport::CallbackInfo::ColumnHeaderData:
            data = info.index + 1;
            break;
        case LimeReport::CallbackInfo::ColumnData:
        {
            if(current_row != info.index)
            {
                current_row = info.index;
                column_counter = 0;
            }
            else ++column_counter;
            //qDebug() << "Current index: " << info.index;
            QTableWidgetItem* currentItem = wgt->item(current_row, column_counter);
            if(currentItem)
            {
                if(column_counter  != 3)
                    data = currentItem->text();
                else
                {
                    QIcon testIcon(":/images/images/tick.png");
                    data = qVariantFromValue(testIcon);
                    //data = qvariant_cast<QIcon>(testIcon);
                }
            }
            break;
        }
    }
}

Т.е здесь в 4 ой колонке  везде должны устанавливаться иконки с галочкой (она маленька 400 байт);
В DataBand для данной колонки я поставил IconItem где data_source - это table_model c нужной колонкой (см. скриншот)
Опять же все поля корректно отображаются кроме иконки.

Есть ли такой функционал и есть подскажите или лучше дайте примерчик)
Заранее спасибо!








[вложение удалено администратором]

Pages: 1 [2]