我需要能够从qt( QGraphicsSceneQImage 的渲染内容)进行打印,以便在普通打印机,pdf上进行缩放,也可以在 custom 打印机上进行缩放,包括滚动输入 .

似乎任何适用于标准打印机的东西都会在自定义打印机上失败,反之亦然 .

我现在已经按照预期在自定义打印机上进行打印工作(在不同打印机中工作之间来回切换) .

  • 我根据长/宽比设置了所需的自定义尺寸和首选方向 .

  • 我打开一个打印对话框(甚至检查供应 - 纸张设置为所需的尺寸,方向按预期设置)

  • 打印:
    在自定义打印机上,我得到正确的尺寸,如果供应量较小,则根据需要打印剪辑 . 边距也正确设置 .
    在Pdf上,我按要求获得了自定义尺寸的文档,正确打印 - 但方向不受尊重! (即使打印对话框显示正确) - 请参阅图像在HP打印机上,我看到一个白页 - 没有打印出来 .

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);

    // some scene to print - show rectangle for 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);
    // this is to show actual scene
    QGraphicsRectItem* contourItem = new QGraphicsRectItem(actualCanvasRect);
    contourItem->setBrush(Qt::blue);
    s->addItem(contourItem);
    // an item partially on canvas (so I can check margins)
    QGraphicsRectItem* item = new QGraphicsRectItem(-.5*in, -in, 2*in, 3*in);
    item->setBrush(Qt::yellow);
    s->addItem(item);

    // actual printing:

    // print the scene, to 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 to open printer");
        return 1;
    }

    // render the contents, clipped to printer page size, and scaled from point to device pixel

    QRectF source = actualCanvasRect;

    // convert target rect to DevicePixel and clip to 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 to page

    // clip source rect to page - without this, if printer paper is smaller I get unwanted scaling
    source &= printer.pageRect(QPrinter::Point);

    s->render(&painter, target, source);
    painter.end();

    return app.exec();
}

我不明白为什么pdf创建一个肖像页面,即使我明确要求横向(不更改打印对话框:见图像) . (宽度和高度相反,但正确 - 文档属性显示4x6,页面尝试正确打印和缩放)

enter image description here

更重要的是,我不明白为什么典型的激光喷墨打印机什么都不打印 - 空白页 - 或者有时候它会缩放到适合的简单画布 .
但是,如果我从HP更改打印对话框中的任何属性,任何不相关的内容(如纸张来源或纸张类型......),它都会正确打印 .

我究竟做错了什么 ?

(使用Qt 4.7和5.5,必须在4.7上工作 - Windows,还没有尝试Linux)