qt - Setting custom paper size with QPrinter doesn't print correctly -


i need able print qt (the rendered contents of qgraphicsscene, or qimage), scale, on normal printer, pdf, on custom printers, including roll fed.

it seems works standard printers fails on custom printers, , reverse.

i have made printing work expected on custom printers (going , forth between works in different printers).

  • i set custom size required, , preferred orientation, based on length/width ratio.

  • i open print dialog (and check supply- paper set desired size, , orientation set expected)

  • print:
    on custom printer, correct size, , if supply smaller, print clips needed. margins set correctly too.
    on pdf, document of custom size requested, printed correctly - orientation not respected !!! (even though print dialog showed correctly) - see image on hp printer, white page - nothing gets printed.

enter image description here

#include <qapplication> #include <qgraphicsview> #include <qgraphicsscene> #include <qgraphicsrectitem> #include <qprinter> #include <qprintdialog>  int main(int argc, char *argv[]) {     qapplication app(argc, argv);      // scene print - show rectangle easy measure     qgraphicsscene* s = new qgraphicsscene();     s->setscenerect(-500, -500, 1500, 1500);     s->setbackgroundbrush(qt::red);     qgraphicsview* view = new qgraphicsview();     view->setscene(s);     view->show();     qreal in = 72;     qrectf canvasrect(-0.1*in, -0.1*in, 6*in, 4*in);     qreal margins = 0.1*in;     qrectf actualcanvasrect = canvasrect.adjusted(margins,margins,-margins,-margins);     // show actual scene     qgraphicsrectitem* contouritem = new qgraphicsrectitem(actualcanvasrect);     contouritem->setbrush(qt::blue);     s->additem(contouritem);     // item partially on canvas (so can check margins)     qgraphicsrectitem* item = new qgraphicsrectitem(-.5*in, -in, 2*in, 3*in);     item->setbrush(qt::yellow);     s->additem(item);      // actual printing:      // print scene, scale, using user margins, on given printer     qprinter printer;     qprinter::orientation orient = (actualcanvasrect.width() >                                     actualcanvasrect.height() ?                                     qprinter::landscape : qprinter::portrait);     printer.setorientation(orient);     printer.setpapersize(canvasrect.size(), qprinter::point);     printer.setpagemargins(margins, margins, margins, margins, qprinter::point);      qprintdialog printdialog(&printer);     if (printdialog.exec() != qdialog::accepted)     {         qdebug("dialog canceled");         return 1;     }      qpainter painter;     if (! painter.begin(&printer))     {         qdebug("failed open printer");         return 1;     }      // render contents, clipped printer page size, , scaled point device pixel      qrectf source = actualcanvasrect;      // convert target rect devicepixel , clip page     qrectf page = printer.pagerect(qprinter::devicepixel);     qreal scale = printer.resolution()/in;     qrectf target = qrectf(page.topleft(), source.size() * scale);     target &= page; // clip target rect page      // clip source rect page - without this, if printer paper smaller unwanted scaling     source &= printer.pagerect(qprinter::point);      s->render(&painter, target, source);     painter.end();      return app.exec(); } 

i don't understand why pdf creates portrait page though requested landscape (without changing print dialog: see image). (the width , height reversed, yet correct - document properties shows 4x6, , page attempts print correctly , scale)

enter image description here

more important, don't understand why typical laser jet printer prints nothing - blank page - or simple canvas scales fit.
if change properties in print dialog hp, irrelevant (like paper source, or paper type.... ), prints correctly.

what doing wrong ?

(using qt 4.7 , 5.5, must work on 4.7 - windows, have yet try linux)


Comments