使用QT5 PrintSupport打印和预览标签

由于需要做一个不干胶标签纸的打印程序,所以用到了PrintSupport。在这里简单记录下,以备自己查看。
一开始只是实现了标签打印功能,后来发现每次修改了标签都要打印出来看效果(节约一些标签纸,因为是特殊印刷的标签纸,数量有限),想到了用PrintSupport中的QPrintPreviewWidget或者QPrintPreviewDialog来实现预览。
不干胶标签的实际尺寸为100x80mm,不干胶标签的载体为103mm宽的纸带,标签在载体上的位置约为向右2mm,向下1mm。于是paper定为(paperWidth,paperHeight) = (103,83),page定为(pageWidth,pageHeight) = (100,80)。leftMarginMM = 2, topMarginMM = 1, rightMarginMM = 1, bottomMarginMM = 2。

    printer = new QPrinter();
    printer->setPrinterName("ZDesigner ZT510-300dpi ZPL");
    printer->setOrientation(QPrinter::Portrait);//设置页面方向 纵向
    printer->setPaperSize(QPrinter::Custom);
    /*
    * 根据文档中的描述,这里不应该注释掉,
    * 另外需要printer->setPageSizeMM(QSizeF(pageWidth, pageHeight));。
    * 但是这样的实际效果是不正确的,我觉得文档可能有些问题。改成现在这样实际效果是正确的。
    * */
    //printer->setPaperSize(QSizeF(paperWidthMM, paperHeightMM), QPrinter::Millimeter);
    printer->setPageSizeMM(QSizeF(paperWidthMM, paperHeightMM));
    printer->setPageMargins(leftMarginMM, topMarginMM, rightMarginMM, bottomMarginMM, QPrinter::Millimeter);
    if (preview != Q_NULLPTR)
        delete preview;
    preview = new QPrintPreviewWidget(printer, this);
    ui->horizontalLayout->addWidget(preview);
    connect(preview, SIGNAL(paintRequested(QPrinter*)), this, SLOT(on_previewPressed(QPrinter*)));
    preview->updatePreview();

下面是预览的实现:

void WndPreview::on_previewPressed(QPrinter *printer)
{
    QPainter painter;
    painter.begin(printer);
    QRectF pageRect = printer->pageRect(QPrinter::Millimeter);
    int widthPixle = int(printer->resolution() * (pageRect.width() / 25.4));
    int heightPixle = int(printer->resolution() * (pageRect.height() / 25.4));
    painter.setViewport(0,0,widthPixle,heightPixle);
    QPen penGreen(QColor(0,255,0));
    painter.setPen(penGreen);
    painter.drawRoundedRect(0,0,widthPixle,heightPixle,30,30);
    QPen penBlack(QColor(0,0,0));
    painter.setPen(penBlack);
    QFont font;
    font.setFamily("Bahnschrift");
    font.setPixelSize(16);
    painter.setFont(font);
    painter.drawText(QPoint(0,50), "Sample");
    font.setPointSize(16);
    painter.setFont(font);
    painter.drawText(QPoint(0,100), "Sample");
    painter.end();
}

打印效果图
绿色的线表示不干胶标签。


版权声明:本文为qq_34400085原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。