QPrinter: wrong margins/page width



  • 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]



  • 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



  • 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?


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.