Russian Qt Forum

Qt => Печать => Тема начата: MrDron от Ноябрь 08, 2017, 21:28



Название: QPrinter. Автоматическое разбиение на страницы
Отправлено: MrDron от Ноябрь 08, 2017, 21:28
Здравствуйте! А можно ли как-то сделать автоматическую разбивку на листы (например A4) при рисовании QPainter'ом?
Дело в том, что есть много длинных вертикальных графиков, которые выгружаются в PDF и получается один длинный лист. newPage() не подходит.
Возможно какой-нибудь отдельной консольной софтиной под винду.


Название: Re: QPrinter. Автоматическое разбиение на страницы
Отправлено: panAlexey от Ноябрь 09, 2017, 10:56
Делал внутри своей софтины. Соответственно сначала рубка на листы идет, а уже потом принтуем:
Код:
/// Вывод на печать....
bool uoReportDoc::printDoc(const bool updPrintSourse, QWidget* qwidg)
{
bool retVal = false;

QPrinter* pPrinter = uoReportManager::instance()->printer();
if(!pPrinter){
qWarning() << QString::fromUtf8("Принтер не создан!");
return retVal;
}

uorAresList* list = m_pageList;
if(updPrintSourse){
list = getPageList();
}
    if (!list || !list->count())    /// Nagumanov 14.05.2010 Добавлена проверка на размер листа
        return retVal;

if (!setupPrinter(*pPrinter, qwidg))
return true;   /// Nagumanov 14.05.2010 Возвращать true, даже если отказались от печати

int pageNomFrom = 0, pageNomTo = 0;
QPrinter::PrintRange prnRange = pPrinter->printRange();
if (prnRange == QPrinter::PageRange) {
pageNomFrom = pPrinter->fromPage();
pageNomTo = pPrinter->toPage();
}
qreal scaleFactor = m_pagesSetings->scale();
qDebug() << QString("bool uoReportDoc::printDoc scaleFactor = %1").arg(scaleFactor);

    uoPainter painter;
    painter.begin(pPrinter);
    painter.scale(scaleFactor,scaleFactor);
    bool firstPage = true;
uoReportDrawHelper* drawHelper = new uoReportDrawHelper(this);
drawHelper->initDrawInstruments();
drawHelper->setDirectDraw(false); // Если используется пиксмап кешер, то текст почему-то печатается на черном фоне белым..
bool usePC = usePictCasher();
setUsePictCasher(false);

uorReportAreaBase aBase;

uorReportPrintArea* area = NULL;
int pageGurNo = 0;
uorAresListCnstIter iter = list->constBegin();
while (iter != list->constEnd()){
pageGurNo += 1;
if (prnRange == QPrinter::PageRange) {
if (!(pageNomFrom<=pageGurNo && pageNomTo>=pageGurNo)){
iter++;
continue;
}
}
if (!firstPage)
pPrinter->newPage();

area = *iter;
aBase = (*area);
aBase.m_areaType = 2;
drawHelper->drawDataArea(painter, aBase);

iter++;
firstPage = false;

}
setUsePictCasher(usePC);
delete drawHelper;
return true;
}


Название: Re: QPrinter. Автоматическое разбиение на страницы
Отправлено: MrDron от Ноябрь 09, 2017, 11:37
Спасибо