LimeReport Forum

General Category | Основное => Discussion | Обсуждение => Topic started by: Dark2011 on November 08, 2016, 02:44:30 PM

Title: Отображение иконки в DataBand в зависимости от данных модели
Post by: Dark2011 on November 08, 2016, 02:44:30 PM
Добрый день.

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

Когда я просто устанавливал модель все данные отображаются нормально, но каким образом в 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 нужной колонкой (см. скриншот)
Опять же все поля корректно отображаются кроме иконки.

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








[вложение удалено администратором]
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Subst on November 08, 2016, 04:03:58 PM
Ну, например, так

$S{
 if (условие)
 "<img src='d:/321.png'>";
else
 "<img src='d:/123.png'>";
 }

Это в текстовом итеме
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Dark2011 on November 08, 2016, 04:38:03 PM
Условие работает а вот картинку не грузит(
$S{
if({$D{table_model.4}})
"<img src='/home/dark/Pictures/Icons/chip1.png'>"
else " "
}

отображается как <img src='/home/dark/Pictures/Icons/chip1.png'>
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Dark2011 on November 08, 2016, 04:41:55 PM
Все сделал - спасибо - нужно было установить галочку allowHTML

А ресурсы qt-ые не поддерживаются?
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Arin Alex on November 08, 2016, 04:48:34 PM
Dark2011, Можно еще и через модель передать как вы делали только вместо QIcon передавать QImage ;

вместо
 QIcon testIcon(":/images/images/tick.png");
 data = qVariantFromValue(testIcon);
нужно
  data = QImage(":/images/images/tick.png");
 
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Arin Alex on November 08, 2016, 04:51:10 PM
Dark2011, Ресурсы поддерживает
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Dark2011 on November 08, 2016, 05:10:48 PM
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 ""
}
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Subst on November 08, 2016, 05:53:58 PM
$S{
if($D{table_model.4}=='0')
     "<img src='/home/dark/Pictures/Icons/chip_1.png'>" ;
else
    "";
    }

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

зачем у тебя скобки фигурные дважды?
{$D{table_model.4}}=='0'  - вот тут
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Arin Alex on November 08, 2016, 05:55:44 PM
Вот пример работает в демке demo_r1

[вложение удалено администратором]
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Dark2011 on November 08, 2016, 06:00:14 PM
$S{
if($D{table_model.4}=='0')
     "<img src='/home/dark/Pictures/Icons/chip_1.png'>" ;
else
    "";
    }

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

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

потому что без них у меня syntax error,
специально вот еще раз проверил
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Subst on November 08, 2016, 06:06:41 PM
кинь отчет, чет фигня какая-то. Откуда синтакс  еррор
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Dark2011 on November 08, 2016, 06:10:48 PM
Вот пример работает в демке demo_r1

У меня выдает syntax error
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Arin Alex on November 08, 2016, 06:12:07 PM
Очень интересно :)
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Subst on November 08, 2016, 06:13:40 PM
QtScript собран?
Если да, то следующий вопрос - LM собран с поддержкой Script ?
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Arin Alex on November 08, 2016, 06:14:21 PM
А версия собрана с гитхаба ? Если да то с какой ветки ?
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Dark2011 on November 08, 2016, 06:21:33 PM
кинь отчет, чет фигня какая-то. Откуда синтакс  еррор
Прикрепил

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

Qt 5.7 gcc 4.8.4




[вложение удалено администратором]
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Subst on November 08, 2016, 06:32:34 PM
table_model откуда? как передаешь?
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Arin Alex on November 08, 2016, 06:34:21 PM
Можно саму прогу сюда или в личку ?
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Arin Alex on November 08, 2016, 06:36:27 PM
Хотя я думаю дело не в ней :) Поскольку если мой демо пример на моей демке выдает ошибку синтаксиса так дело в скриптовом движке
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Arin Alex on November 08, 2016, 06:37:03 PM
Subst, Можешь у себя мою демку запустить ?
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Subst on November 08, 2016, 06:41:49 PM
Все в поряке, ошибка синтаксиса возникает при отсутсвии датасорса... потому и спрашиваю, откуда Дарк его берет и как загоняет в отчет
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Arin Alex on November 08, 2016, 06:43:49 PM
Subst, Вся проблема в том что Dark2011, написал, что моя демка у него тоже ошибку синтаксиса вызывает.
И потом у Dark2011 отчет работает :) до тех пор пока он скритп не начинает юзать соответственно датасоурс у него в порядке
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Subst on November 08, 2016, 06:45:09 PM
Может версия, которую он забрал, еще сырая? Когда ты ее выкладывал и сколько воды утекло уже... месяца 3-4 назад бинарники ты собирал. Вспомни сколько переделал с тех пор
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Arin Alex on November 08, 2016, 06:47:32 PM
Subst, Да не, специально сейчас пересобрал версию с SF, именно этих глюков я не наблюдаю.
SF конечно надо обновить :) Я вот просто не пойму толь 1.3.12 запилить на мастере толь уже 1.4 в мастер смержить и выложить на SF
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Subst on November 08, 2016, 06:51:26 PM
ну вот я запускаю твой отчет на предосмотр при отсутствии базы... синтакс еррор: паос еррор

очевидно, что дело всего лишь в этом. Видит ли БД LM у Дарка...
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Arin Alex on November 08, 2016, 06:56:30 PM
Дарк куда-то пропал :) 
Хотя Дарк писал
Quote
Если просто $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 ""
}
Из этого я делаю вывод, что данные проброшены нормально
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Subst on November 08, 2016, 06:58:13 PM
Обиделся, что не работает, может? :)
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Dark2011 on November 08, 2016, 07:55:12 PM
Спокуха:) До компа если доберусь сеня выложу, нет - так с утречка....)
Там весь исходник считай это ваша демо1, тока я там все потер и вместо это QTableWidget заполнил
и юзал его модель.... смотри код первого поста
Ошибка при использовании скрипта, данные из модели доступны
Скачал из гита последнюю версию завтра буду собирать пробовать
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Dark2011 on November 09, 2016, 12:15:08 AM
Значится так.... Проверял я все это дело с тем что в мастере на гите.
Если данные устанавливать вот так ( пример 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 - твоя демка работает когда есть ресур - а когда нет синтакс еррор

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





[вложение удалено администратором]
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Subst on November 09, 2016, 08:31:14 AM
qDebug() << "Test data: " << currentItem->text();

это в консоль кидает?
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Dark2011 on November 09, 2016, 11:10:03 AM
Да, и при том данные правильные
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Dark2011 on November 09, 2016, 11:48:31 AM
объясните мне пожалуйста как работать с qrc ресурсами
 Arin Alex - в твоем примере ты используеш основной ресурс lm (report.qrc),
если я хочу использовать свой ресурс - как это сделать?
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Subst on November 09, 2016, 02:40:44 PM
по теме колбэка потом еще гляну.

По последней... не понял, в чем пробема? Цепляешь к проекту qrc, запускаешь из проекта дизайнер

LimeReport::ReportEngine *m_report=new LimeReport::ReportEngine(this);
m_report->designReport();

и спокойно юзаешь твой qrc
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Dark2011 on November 09, 2016, 06:05:07 PM
по теме колбэка потом еще гляну.

По последней... не понял, в чем пробема? Цепляешь к проекту qrc, запускаешь из проекта дизайнер

LimeReport::ReportEngine *m_report=new LimeReport::ReportEngine(this);
m_report->designReport();

и спокойно юзаешь твой qrc

Все понял, спасибо....работает
Title: Re: Отображение иконки в DataBand в зависимости от данных модели
Post by: Subst on November 10, 2016, 09:40:28 AM
Дарк, вот тут глянь...

в prepareData

 case LimeReport::CallbackInfo::ColumnHeaderData:
            data = info.index + 1

ты обращаешься к столбцу через имя в LM, а передаешь число.

попробуй так data=QString::number(info.index+1,10)