LimeReport Forum
General Category | Основное => Discussion | Обсуждение => Topic started by: Dark2011 on November 08, 2016, 02:44:30 pm
-
Добрый день.
Есть табличная модель. В зависимости от данных в одной из колонок должна отображаться та или иная иконка
(если не ноль то галочка если ноль то крестик или ничего)
В приложении эту роль играет делегат. Как подобный функционал осуществить здесь?
Когда я просто устанавливал модель все данные отображаются нормально, но каким образом в IconItem установленной в DataBand отображать ту или иную иконку в зависимости от значений я не понял - это вообще возможно?... TextItem же я так понял никакую иконку установить тоже не может - это чисто текст;
... где то в конструкторе
my_model = new MyTestTableModel(this);
report->dataManager()->addModel("table_model",my_model, true);
Попробовал другим путем (для примера взял QTableWidget) - в slotGetCallbackData в нужной колонки устанавливаю иконку из ресурсов (просто для теста а не из конретного айтема)
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 нужной колонкой (см. скриншот)
Опять же все поля корректно отображаются кроме иконки.
Есть ли такой функционал и есть подскажите или лучше дайте примерчик)
Заранее спасибо!
[вложение удалено администратором]
-
Ну, например, так
$S{
if (условие)
"<img src='d:/321.png'>";
else
"<img src='d:/123.png'>";
}
Это в текстовом итеме
-
Условие работает а вот картинку не грузит(
$S{
if({$D{table_model.4}})
"<img src='/home/dark/Pictures/Icons/chip1.png'>"
else " "
}
отображается как <img src='/home/dark/Pictures/Icons/chip1.png'>
-
Все сделал - спасибо - нужно было установить галочку allowHTML
А ресурсы qt-ые не поддерживаются?
-
Dark2011, Можно еще и через модель передать как вы делали только вместо QIcon передавать QImage ;
вместо
QIcon testIcon(":/images/images/tick.png");
data = qVariantFromValue(testIcon);
нужно
data = QImage(":/images/images/tick.png");
-
Dark2011, Ресурсы поддерживает
-
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 ""
}
-
$S{
if($D{table_model.4}=='0')
"<img src='/home/dark/Pictures/Icons/chip_1.png'>" ;
else
"";
}
ну вот так вроде
зачем у тебя скобки фигурные дважды?
{$D{table_model.4}}=='0' - вот тут
-
Вот пример работает в демке demo_r1
[вложение удалено администратором]
-
$S{
if($D{table_model.4}=='0')
"<img src='/home/dark/Pictures/Icons/chip_1.png'>" ;
else
"";
}
ну вот так вроде
зачем у тебя скобки фигурные дважды?
{$D{table_model.4}}=='0' - вот тут
потому что без них у меня syntax error,
специально вот еще раз проверил
-
кинь отчет, чет фигня какая-то. Откуда синтакс еррор
-
Вот пример работает в демке demo_r1
У меня выдает syntax error
-
Очень интересно :)
-
QtScript собран?
Если да, то следующий вопрос - LM собран с поддержкой Script ?
-
А версия собрана с гитхаба ? Если да то с какой ветки ?
-
кинь отчет, чет фигня какая-то. Откуда синтакс еррор
Прикрепил
QtScript собран?
Если да, то следующий вопрос - LM собран с поддержкой Script ?
QtScript собран, LM - без понятия
А версия собрана с гитхаба ? Если да то с какой ветки ?
Версия с sourceforge та что 1.3.11.7z весит 3.5мб :)
Qt 5.7 gcc 4.8.4
[вложение удалено администратором]
-
table_model откуда? как передаешь?
-
Можно саму прогу сюда или в личку ?
-
Хотя я думаю дело не в ней :) Поскольку если мой демо пример на моей демке выдает ошибку синтаксиса так дело в скриптовом движке
-
Subst, Можешь у себя мою демку запустить ?
-
Все в поряке, ошибка синтаксиса возникает при отсутсвии датасорса... потому и спрашиваю, откуда Дарк его берет и как загоняет в отчет
-
Subst, Вся проблема в том что Dark2011, написал, что моя демка у него тоже ошибку синтаксиса вызывает.
И потом у Dark2011 отчет работает :) до тех пор пока он скритп не начинает юзать соответственно датасоурс у него в порядке
-
Может версия, которую он забрал, еще сырая? Когда ты ее выкладывал и сколько воды утекло уже... месяца 3-4 назад бинарники ты собирал. Вспомни сколько переделал с тех пор
-
Subst, Да не, специально сейчас пересобрал версию с SF, именно этих глюков я не наблюдаю.
SF конечно надо обновить :) Я вот просто не пойму толь 1.3.12 запилить на мастере толь уже 1.4 в мастер смержить и выложить на SF
-
ну вот я запускаю твой отчет на предосмотр при отсутствии базы... синтакс еррор: паос еррор
очевидно, что дело всего лишь в этом. Видит ли БД LM у Дарка...
-
Дарк куда-то пропал :)
Хотя Дарк писал
Если просто $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 ""
}
Из этого я делаю вывод, что данные проброшены нормально
-
Обиделся, что не работает, может? :)
-
Спокуха:) До компа если доберусь сеня выложу, нет - так с утречка....)
Там весь исходник считай это ваша демо1, тока я там все потер и вместо это QTableWidget заполнил
и юзал его модель.... смотри код первого поста
Ошибка при использовании скрипта, данные из модели доступны
Скачал из гита последнюю версию завтра буду собирать пробовать
-
Значится так.... Проверял я все это дело с тем что в мастере на гите.
Если данные устанавливать вот так ( пример demo_r1 в конструкторе) :
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);
то все пучком - скрипт норм работает
скрипт:
$S{
if ($D{table_model.4}!="0")
"<img src='/home/dark2011/workspace/LimeReport/demo_r1/images/tick.png'>"
else
""
}
но если делать через сигнально-слотовое соединение вот так:
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)
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} - это работает
$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 - твоя демка работает когда есть ресур - а когда нет синтакс еррор
в общем в атаче исходники
[вложение удалено администратором]
-
qDebug() << "Test data: " << currentItem->text();
это в консоль кидает?
-
Да, и при том данные правильные
-
объясните мне пожалуйста как работать с qrc ресурсами
Arin Alex - в твоем примере ты используеш основной ресурс lm (report.qrc),
если я хочу использовать свой ресурс - как это сделать?
-
по теме колбэка потом еще гляну.
По последней... не понял, в чем пробема? Цепляешь к проекту qrc, запускаешь из проекта дизайнер
LimeReport::ReportEngine *m_report=new LimeReport::ReportEngine(this);
m_report->designReport();
и спокойно юзаешь твой qrc
-
по теме колбэка потом еще гляну.
По последней... не понял, в чем пробема? Цепляешь к проекту qrc, запускаешь из проекта дизайнер
LimeReport::ReportEngine *m_report=new LimeReport::ReportEngine(this);
m_report->designReport();
и спокойно юзаешь твой qrc
Все понял, спасибо....работает
-
Дарк, вот тут глянь...
в prepareData
case LimeReport::CallbackInfo::ColumnHeaderData:
data = info.index + 1
ты обращаешься к столбцу через имя в LM, а передаешь число.
попробуй так data=QString::number(info.index+1,10)