Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. QPrinter: wrong margins/page width
QtWS25 Last Chance

QPrinter: wrong margins/page width

Scheduled Pinned Locked Moved General and Desktop
3 Posts 2 Posters 4.5k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • H Offline
    H Offline
    hp321
    wrote on last edited by
    #1

    Hi. I have problem with printing rectangle with QPrinter on real device. Rectangle which I would like to draw is often cliped by a printer. With bigger marins I have other issue. Right margin is larger than left. Code below works great when it's export to PDF file or PS.
    What I am doing wrong? Please help me. Without this simple task I can not finish my project.

    @QPrinter printer;
    printer.setPageSize(QPrinter::A4);
    printer.setFullPage(true);
    // printer.setOutputFormat(QPrinter::PdfFormat);
    // printer.setOutputFileName("test.pdf");

    QRectF rect = printer.pageRect();

    double margin = rect.width()*0.05;

    QRectF body = QRectF(margin, margin, rect.width()-margin2, rect.height()-margin2);

    QPainter painter(&printer);
    painter.drawRect(body);

    QTextOption option;
    option.setAlignment(Qt::AlignRight);

    painter.drawText(body, "test right", option);
    painter.drawText(body, "test left");@

    [edit: fixed typo in title, eddy]

    1 Reply Last reply
    0
    • N Offline
      N Offline
      nicomesas
      wrote on last edited by
      #2

      Hello
      Recently I found a similar problem when printing in Hewlett-Packard printers.

      After many tests they decided to make a little app for test the same, but made with pure MFC (without using Qt). The result was the same.

      Thus I have deduced that the problem is neither in my program or Qt, but must be in the printer driver as this problem has left me only with HP printers.

      Regards

      1 Reply Last reply
      0
      • H Offline
        H Offline
        hp321
        wrote on last edited by
        #3

        OK. I think that is the Qt problem because this WIN32 code works great (I have HP printer to):
        @PRINTDLG pd;
        ZeroMemory(&pd, sizeof(PRINTDLG));

        pd.lStructSize = sizeof(PRINTDLG);
        //pd.hwndOwner = m_hWnd;
        pd.hDevMode = NULL;
        pd.hDevNames = NULL;
        pd.Flags = PD_USEDEVMODECOPIESANDCOLLATE | PD_RETURNDC;
        pd.nCopies = 1;
        pd.nFromPage = 0xFFFF;
        pd.nToPage = 0xFFFF;
        pd.nMinPage = 1;
        pd.nMaxPage = 0xFFFF;

        if (!PrintDlg(&pd))
        {
        QMessageBox::warning(0,"Problem", "Cos z drukarka");
        exit(0);
        }

        int LM = 0.5GetDeviceCaps(pd.hDC, LOGPIXELSX);
        int TM = 0.5
        GetDeviceCaps(pd.hDC, LOGPIXELSY);

        int LO = LM - GetDeviceCaps(pd.hDC, PHYSICALOFFSETX);
        int RO = LM - (GetDeviceCaps(pd.hDC, PHYSICALWIDTH) - GetDeviceCaps(pd.hDC, PHYSICALOFFSETX) - GetDeviceCaps(pd.hDC, HORZRES));
        int TO = TM - GetDeviceCaps(pd.hDC, PHYSICALOFFSETY);
        int BO = TM - (GetDeviceCaps(pd.hDC, PHYSICALHEIGHT) - GetDeviceCaps(pd.hDC, PHYSICALOFFSETY) - GetDeviceCaps(pd.hDC, VERTRES));

        if (LO<0) LO = 0;
        if (RO<0) RO = 0;
        if (TO<0) TO = 0;
        if (BO<0) BO = 0;

        int PW = GetDeviceCaps(pd.hDC, HORZRES) - (LO+RO);
        int PH = GetDeviceCaps(pd.hDC, VERTRES) - (TO+BO);

        qDebug() << "margins: " << LM << TM;
        qDebug() << "offsets: " << LO << RO << TO << BO;
        qDebug() << "width, height: " << PW << PH;
        qDebug() << "width, height2: " << GetDeviceCaps(pd.hDC, HORZRES) << GetDeviceCaps(pd.hDC, VERTRES);

        DOCINFO di;
        di.cbSize = sizeof(DOCINFO);
        di.lpszOutput = (LPTSTR)NULL;
        di.fwType = 0;
        StartDoc (pd.hDC, &di);
        StartPage(pd.hDC);

        // OUR RECTANGLE !!!
        Rectangle(pd.hDC, LO, TO, LO+PW, TO+PH);

        EndPage(pd.hDC);
        EndDoc(pd.hDC);
        DeleteDC(pd.hDC);@

        Maybe the solution is in to mix WIN32 code with Qt?

        1 Reply Last reply
        0

        • Login

        • Login or register to search.
        • First post
          Last post
        0
        • Categories
        • Recent
        • Tags
        • Popular
        • Users
        • Groups
        • Search
        • Get Qt Extensions
        • Unsolved