Qt-打印机

在项目开发过程中,涉及到打印机的使用,很幸运,Qt的打印机模块printsupport的支持是的打印简单些。

在查询打印模块的类时,体会到Qt的对于这种硬件的结构层次的封装,数据库等类结构也是如此。我的见解如下,提供custom core和widget。

core

  • QPrinterInfo,对已存在的打印机的封装。
  • QPrinter,打印的执行体。

widget

  • QPrintDialog,打印设置弹窗,一般不可见,代码中设置相关参数。
  • QPrintPreviewDialog,打印预览弹窗。

本次主要说说,富文本的打印,即将html文本打印出来,由于使用的打印机经常是custom打印机,需要明白一下的接口含义。

    // 获取可用打印设备
    QList<QPrinterInfo> printerList = QPrinterInfo::availablePrinters();

    // 默认打印设备 eg,标准打印
    QPrinterInfo defaultPrinter = QPrinterInfo::defaultPrinter();
    defaultPrinter.defaultPageSize();// eg:A4 (210 x 297 mm)
    defaultPrinter.defaultPageSize().definitionUnits();// eg:纸张单位 eg:mm
    defaultPrinter.defaultPageSize().definitionSize();// eg:210 x 297
    defaultPrinter.supportedPageSizes();// 可选的打印纸张大小 eg:A3 B.....

    // 根据打印机名称指定,eg:sony的自定义
    QPrinterInfo sonyPrinter = QPrinterInfo::printerInfo(QString("Sony UP-898 Series"));
    sonyPrinter.defaultPageSize();// eg:960x1280【custom 30】(230p x 312p)
    sonyPrinter.defaultPageSize().definitionUnits();// eg:point 即一英寸的1/72
    sonyPrinter.defaultPageSize().definitionSize();// eg:230px312p
    sonyPrinter.supportedPageSizes();// 可选大小
    sonyPrinter.supportsCustomPageSizes();// 是否支持自定义尺寸纸张

  • defaultPageSize,指定该打印机默认纸张大小,就是我们所说的A3,A4....
  • definitionUnits,纸张所使用的单位,ISO为mm,ANSI为英寸,sony使用的是point , 1point = 1/72in
  • definitionSize,纸张尺寸,仅仅是数据。
    QPrinter printer;
    // per in has dots number, 打印机绘制引擎
    printer.logicalDpiX(); printer.logicalDpiY();
    // 物理分辨率
    printer.physicalDpiX(); printer.physicalDpiY();

关于打印机设备的分辨率,我们使用逻辑Dpi。

实践中,我们html文本要与纸张的尺寸进行尺寸映射即可。

    /*****富文本打印**********/
    QPagedPaintDevice::Margins marg;
    marg.left = 0;
    marg.right = 0;
    marg.top = 0;
    marg.bottom = 0;

    QPrinter printer;
    printer.setOutputFormat(QPrinter::NativeFormat);
    printer.setPageSize(QPrinter::Custom);	//自定义纸张大小
    printer.setPaperSize(QPrinter::Custom);
    printer.setMargins(marg);

    //富文本打印
    QString strHtml;
    QTextDocument textDocument;
    textDocument.setDefaultFont(QFont("宋体", 18, QFont::Medium));
    textDocument.setHtml(strHtml);
    textDocument.setDocumentMargin(0);

    //获取当前打印机的正使用的pageSize
    QPrinterInfo info = QPrinterInfo::defaultPrinter();
    QSizeF defaultSize = info.defaultPageSize().definitionSize();
    //计算打印机的实际pageSize  dpiX*inch     即分辨率*英寸
    QSizeF s = QSizeF(printer.logicalDpiX() * (defaultSize.width() / 72), printer.logicalDpiY() * (defaultSize.height() / 72)); //设置打印大小
    //将textDocument的pageSize同与打印机逻辑尺寸
    textDocument.setPageSize(s);

    if(true){
        // 打印html
        textDocument.print(&printer);
    }
    else{
        // 将要打印的html进行图片保存
        QImage image = QImage(s.width(), s.height(), QImage::Format_RGB888);
        QPainter painter(&image);
        textDocument.drawContents(&painter);
        image.save("D:\\qwewqe.jpg", "jpg", 100);
    }
  • help  1in = 25.4mm 1point = 1/72in

 

猜你喜欢

转载自blog.csdn.net/qq_39175540/article/details/86135985