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 - Subst

Pages: 1 ... 28 29 [30]
436
Discussion | Обсуждение / Re: проблема с DataS
« on: April 13, 2016, 08:04:57 PM »
Ну как бы маловероятно, что кому-то в процессе работы с программой надо будет редактировать название полей. Вроде как вотчина программиста. Так что EditRole тут вполне безовасно использовать. Разве что, какой-то конструктор Модели будет делаться

437
Discussion | Обсуждение / Re: проблема с DataS
« on: April 13, 2016, 07:43:55 PM »
Вариант.
Но есть один ньюанс. Если разработчику данный момент непринципиален, то в случае EditRole ему не нужно писать дополнительный код. А в случае UserRole придется.

EditRole=DisplayRole, если не переопределено явно, а UserRole=QVariant()

тут уж смотри, как удобней.

438
Discussion | Обсуждение / Re: проблема с DataS
« on: April 13, 2016, 06:43:28 PM »
Внес изменения, пересобрал, вроде работает

439
Discussion | Обсуждение / Re: проблема с DataS
« on: April 13, 2016, 06:26:31 PM »
Итак...

Проблема в том, что lrdatadesignintf.cpp
в качестве названия поля берется headerName(). И это логично, поскольку в QAbstractItemModel это единственное свойство, определяющее текстовое обозначение столбца. Но нам от этого не легче...

Как вариант, для определения названия в report'е брать это же свойство, но, скажем, не c Qt::DisplayRole (по умолчанию), а с Qt::EditRole.
Ну и описать в мануале, что надо задавать два свойства для столбцов. Иначе будем сталкиваться с этой проблемой.

Вот код:

QString ModelToDataSource::columnNameByIndex(int columnIndex)
{
    if (isInvalid()) return "";
    return m_model->headerData(columnIndex,Qt::Horizontal).toString();  <----------------------------
}


Ну и, соответвенно, поправить смежные функции, такие как

int ModelToDataSource::columnIndexByName(QString name)

может, что-то еще, не копал пока дальше. Жду ответа и мнения от Алекса

440
Discussion | Обсуждение / проблема с DataS
« on: April 13, 2016, 05:13:16 PM »
У меня проблема следующая:

m_report->dataManager()->addModel(...) замечательно работает. Но до тех пор, пока я не сделаю локализацию, после этого
в списке полей отчета пропадает оригинально название поля, но появляется локализованное.

скажем поле city. В программе код setHeaderData(fieldIndex("city"),tr("City"));

Вот в limeReport и отображается как tr("City"), если в локализации Это "Город", то и будет Город. Крайне неудобно и похоже на баг (ну или фичу, если угодно :) ).

т.е. сделал отчет, локализовал программу - отчет заново творить. Сделал перевод на иной язык - отчет заново творить.

Копаю исходники, смотрю, где вместо fieldName подставляется headerName...

P.S. не исключено, что корни проблеммы одни, что описал drow в предыдущем топике

441
Discussion | Обсуждение / renderPageFinished(int)
« on: April 07, 2016, 05:40:17 AM »
Доброго времени суток опять!

при попытке отследить процесс рендеринга, обнаружил проблему в сигнале renderPageFinished(int):

кол-во завершенных страниц всегда на 1 больше реального. Ну, как уже принято, покопался.

файл lrrenderengine.cpp, строки 546-547

    connect(m_reportRender.data(),SIGNAL(pageRendered(int)),
            this, SIGNAL(renderPageFinished(int)));

далее:

файл lrreportrender.cpp, строки 966-978:

   if (m_ranges.last().lastPage==0 && m_ranges.count()>1) {
        m_datasources->setReportVariable("#PAGE",1);
    } else {
        m_datasources->setReportVariable("#PAGE",m_datasources->variable("#PAGE").toInt()+1);
    }

    m_ranges.last().lastPage = m_pageCount;
    m_pageCount++;

    BandDesignIntf* pageFooter = m_renderPageItem->bandByType(BandDesignIntf::PageFooter);
    if (pageFooter) pageFooter->setBandIndex(++m_currentIndex);
    m_renderedPages.append(PageItemDesignIntf::Ptr(m_renderPageItem));
    emit pageRendered(m_pageCount)

мне все же видится, что увеличить m_pageCount надо после emit pageRendered(m_pageCount)

P.S. вносить изменения и пересобирать еще не пробовал,





442
Discussion | Обсуждение / Re: CalBack и RowCount
« on: April 06, 2016, 07:08:15 AM »
К предыдущему посту:
чуть позже увидел обновленные исходники

lrdatadesignintf.cpp
 
615      -    if (m_rowCount == -1){
616      -        QVariant rowCount;
617      -        CallbackInfo info;
618      -        info.dataType = CallbackInfo::RowCount;
619      -        emit getCallbackData(info,rowCount);
620      -        if (rowCount.isValid()) m_rowCount = rowCount.toInt();
621      -    }
   615   +
   616   +    QVariant rowCount;
   617   +    CallbackInfo info;
   618   +    info.dataType = CallbackInfo::RowCount;
   619   +    emit getCallbackData(info,rowCount);
   620   +    if (rowCount.isValid()) m_rowCount = rowCount.toInt();
   621   +

Пересобрал, да, проблема решилась, Вы обнаружили этот баг на несколько часов раньше. Спасибо!

443
Discussion | Обсуждение / CalBack и RowCount
« on: April 06, 2016, 05:46:59 AM »
Вчера собрал последние исходники. Обнаружил баг следующий:

при повторном вызове, например, previewReport происходит следующее:

getCallbackData(LimeReport::CallbackInfo info, QVariant &value) с параметром RowCount не вызывается. Что может привести как к крешу, так и не верному отображению информации в силу факта, что данные могли поменяться, а rowCount останется прежним.

Поковырял исходники. в lrdatadesignintf.cpp
в строке 615 стоит условие для обновления rowCount

if (m_rowCount == -1)

не может ли здесь собака порыться? мне кажется это условие и будет гарантировать запрос rowCount Только один раз.

444
Discussion | Обсуждение / LimeReport & 64 bit
« on: March 25, 2016, 06:56:13 AM »
При сборке на 64-х битной платформе компилятором MinGW 64 сборка вываливается. После просмотра и некоторого изучения кода баг обнаружен следующий:

Последние исходники с GIT от 24.03.2016, файл lrreportrender.cpp

строка 555
m_popupedValues.insert(QString::number((long)dataBand,16)+'|'+gf->data(), gf->values()[gf->values().count()-1]);

строка 571
gf->values().push_back(m_popupedValues.value(QString::number((long)dataBand,16)+'|'+gf->data()));

В 64-х битных системах (long)dataBand - вызовет ошибку, long - 32-х битная величина, указатель в 64-х битных системах - 64-х битная величина.

Исправляется путем преобразования не в long, а в long long, т.е.

строка 555
m_popupedValues.insert(QString::number((long long)dataBand,16)+'|'+gf->data(), gf->values()[gf->values().count()-1]);

строка 571
gf->values().push_back(m_popupedValues.value(QString::number((long long)dataBand,16)+'|'+gf->data()));

P.S. Может кому пригодится

Pages: 1 ... 28 29 [30]