3

我需要能够从 qt(aQGraphicsScene或 a的渲染内容QImage)打印,以在普通打印机、pdf 以及自定义打印机(包括卷筒纸)上进行缩放。

似乎任何适用于标准打印机的东西在定制打印机上都失败了,反之亦然。

我现在已经在定制打印机上按预期完成了打印工作(在不同打印机的工作之间来回切换)。

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

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

  • 打印:
    在定制打印机上,我得到了正确的尺寸,如果供应量较小,则根据需要进行打印剪辑。边距也设置正确。
    在 Pdf 上,我得到了一个按要求正确打印的自定义大小的文档 - 但方向没有得到尊重!(即使打印对话框正确显示) - 参见图像 在 HP 打印机上,我得到一个白页 - 没有打印任何内容。

在此处输入图像描述

#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,页面尝试正确打印和缩放)

在此处输入图像描述

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

我究竟做错了什么 ?

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

4

0 回答 0