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

Author Topic: Отображение иконки в DataBand в зависимости от данных модели  (Read 17191 times)

Dark2011

  • Newbie
  • *
  • Posts: 27
    • View Profile
Добрый день.

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

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

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








[вложение удалено администратором]
« Last Edit: November 08, 2016, 02:49:13 pm by Dark2011 »

Subst

  • Sr. Member
  • ****
  • Posts: 450
    • View Profile
Ну, например, так

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

Это в текстовом итеме

Dark2011

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

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

Dark2011

  • Newbie
  • *
  • Posts: 27
    • View Profile
Все сделал - спасибо - нужно было установить галочку allowHTML

А ресурсы qt-ые не поддерживаются?
« Last Edit: November 08, 2016, 04:44:11 pm by Dark2011 »

Arin Alex

  • Developer
  • Administrator
  • Hero Member
  • *****
  • Posts: 1005
    • View Profile
Dark2011, Можно еще и через модель передать как вы делали только вместо QIcon передавать QImage ;

вместо
 QIcon testIcon(":/images/images/tick.png");
 data = qVariantFromValue(testIcon);
нужно
  data = QImage(":/images/images/tick.png");
 

Arin Alex

  • Developer
  • Administrator
  • Hero Member
  • *****
  • Posts: 1005
    • View Profile
Dark2011, Ресурсы поддерживает

Dark2011

  • Newbie
  • *
  • Posts: 27
    • View Profile
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 ""
}
« Last Edit: November 08, 2016, 05:12:23 pm by Dark2011 »

Subst

  • Sr. Member
  • ****
  • Posts: 450
    • View Profile
$S{
if($D{table_model.4}=='0')
     "<img src='/home/dark/Pictures/Icons/chip_1.png'>" ;
else
    "";
    }

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

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

Arin Alex

  • Developer
  • Administrator
  • Hero Member
  • *****
  • Posts: 1005
    • View Profile
Вот пример работает в демке demo_r1

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

Dark2011

  • Newbie
  • *
  • Posts: 27
    • View Profile
$S{
if($D{table_model.4}=='0')
     "<img src='/home/dark/Pictures/Icons/chip_1.png'>" ;
else
    "";
    }

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

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

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

Subst

  • Sr. Member
  • ****
  • Posts: 450
    • View Profile
кинь отчет, чет фигня какая-то. Откуда синтакс  еррор

Dark2011

  • Newbie
  • *
  • Posts: 27
    • View Profile
Вот пример работает в демке demo_r1

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

Arin Alex

  • Developer
  • Administrator
  • Hero Member
  • *****
  • Posts: 1005
    • View Profile
Очень интересно :)

Subst

  • Sr. Member
  • ****
  • Posts: 450
    • View Profile
QtScript собран?
Если да, то следующий вопрос - LM собран с поддержкой Script ?

Arin Alex

  • Developer
  • Administrator
  • Hero Member
  • *****
  • Posts: 1005
    • View Profile
А версия собрана с гитхаба ? Если да то с какой ветки ?