Russian Qt Forum

Qt => Печать => Тема начата: qate от Январь 17, 2014, 13:03



Название: не могу задать размер печати
Отправлено: qate от Январь 17, 2014, 13:03
Hi !

В исходных кодах есть пример (qt-everywhere-opensource-src-4.8.4/examples/graphicsview/portedcanvas), в нем интересен только метод печати.
Поправил его так (добавил печать в pdf):

Код:
void Main::print()
{
//---------------add------------------
    QPrinter printerP;
    printerP.setOutputFormat(QPrinter::PdfFormat);
    printerP.setOutputFileName("test.pdf");
    printerP.setPaperSize(QSizeF(1, 1), QPrinter::Inch);
    printerP.setPageMargins(0, 0, 0, 0, QPrinter::Inch);
    QPainter pP(&printerP);
    canvas.render(&pP);
    pP.end();
//---------------add------------------

    if ( !printer ) printer = new QPrinter;
    QPrintDialog dialog(printer, this);
    if(dialog.exec()) {
        QPainter pp(printer);
        printer->setPaperSize(QSizeF(1, 1), QPrinter::Inch);
        printer->setPageMargins(0, 0, 0, 0, QPrinter::Inch);
        canvas.render(&pp);
    }
}

При этом test.pdf создается с желаемым размером, а если напечатать на реальный принтер (или в pdf средствами системы), то имею A4 - почему так ?
Также ms office word может распечатать (и на pdf) принтер с любыми размерами.
Т.о. что не хватает в приведенном коде для печати на желаемый размер бумаги ?


Название: Re: не могу задать размер печати
Отправлено: viktand от Апрель 09, 2014, 13:37
Почти та же проблема. Задаю 10х15, печатает правильно, но позиционирует область печати в нижний левый угол А4. Т.е. если положить в лоток реальный лист 10х15, то на него ничего не попадет.

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

Код:
               printer->setPaperSize(QPrinter::A4);
               qreal l, b;
               l=(210-102)/2;
               b=297-152;
               printer->setPageMargins(l,0,l,b,QPrinter::Millimeter);

Вместо 102 и 152 у меня реально стоят переменные с меняющимися значениями размеров листа.
Нижнее поле можно в принципе не задавать, туда все равно ничего не попадает.

Работает, но чувствую, что это не правильно и некрасиво.