QPrinter打印类怎么自定义纸张大小

gucunlin 2013-07-02 02:01:34
需要借用它生成pdf文档,但是大小总是通过枚举去设置的。有个setPageSize(QPrinter::Custom)又不知道下一步该 怎么设置 。设置成Custom还是A4默认大小 的
...全文
5544 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Inhibitory 2013-07-02
  • 打赏
  • 举报
回复
我打印用的程序,可以参考一下
#include "Widget.hpp"
#include "ui_Widget.h"

#include <QPainter>
#include <QPrinter>
#include <QFile>
#include <QDebug>
#include <QRegExp>
#include <QTextDocument>
#include <QPrintDialog>
#include <QPrintPreviewDialog>
#include <QDateTime>
#include <QPageSetupDialog>

Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) {
    ui->setupUi(this);

    printer = new QPrinter();
    printer->setFullPage(true);
    printer->setOrientation(QPrinter::Portrait);
    printer->setOutputFormat(QPrinter::NativeFormat);

    connect(ui->printOrderButton, SIGNAL(clicked()), this, SLOT(printOrder()));
    connect(ui->printOrdersButton, SIGNAL(clicked()), this, SLOT(printOrders()));
}

Widget::~Widget() {
    delete ui;
}

void Widget::printOrder() {
    printer->setPaperSize(QPrinter::A6);

    // 没连打印机这个窗口弹不出来.
    //    QPageSetupDialog setupDialog(&printer, this);
    //    setupDialog.exec();

    //    qDebug() << printer.getPageMargins();

    // 打印预览.
    QPrintPreviewDialog preview(printer, this);
    connect(&preview, SIGNAL(paintRequested(QPrinter*)), this, SLOT(printOrder(QPrinter*)));
    preview.exec();
//    printOrder(printer);
}

void Widget::printOrders() {
    printer->setPaperSize(QPrinter::A4);

    // 打印预览.
    QPrintPreviewDialog preview(printer, this);
    connect(&preview, SIGNAL(paintRequested(QPrinter*)), this, SLOT(printOrders(QPrinter*)));
    preview.exec();

    printOrders(printer);
}

void Widget::printOrder(QPrinter* printer) {
    QString html = createOrderHtml();
    printHtml(html, printer);
}

void Widget::printOrders(QPrinter* printer) {
    QString html = createOrdersHtml();
    printHtml(html, printer);
}

void Widget::printHtml(const QString &html, QPrinter *printer) {
    QTextDocument doc;

    QFont font;
    font.setPointSize(10); // TODO: font size from settings.

    doc.setDefaultFont(font);
    doc.setHtml(html);
    doc.print(printer);

    ui->textEdit->setHtml(html);
}

QString Widget::createOrderHtml() {
    QString html = readHtmlPattern("OrderHtmlPattern.html");

    return html;
}

QString Widget::createOrdersHtml() {
    QString html = readHtmlPattern("OrdersHtmlPattern.html");
    QStringList lines = html.split("\n");

    QString tr;
    QString tr0;
    QString tr1;
    QString trs;

    // Read the tr patterns.
    for (int i = 0; i < lines.size(); i++) {
        tr = lines.at(i).trimmed();

        if (tr.contains("class=\"TR0\"")) {
            tr0 = tr.replace("<!--", "").replace("-->", "");
        }

        if (tr.contains("class=\"TR1\"")) {
            tr1 = tr.replace("<!--", "").replace("-->", "");
        }
    }

    QStringList list;
    list << "打印<br>内容<br>学习" << "打印<br>内容" << "打印" << "打印<br>内容<br>学习<br>去哪里学习";
    qsrand(QDateTime::currentDateTime().toTime_t());

    // Build trs using the orders.
    for (int i = 0; i < 5; ++i) {
        tr = (i & 0x1) == 0 ? tr0 : tr1;
        trs += tr.arg("0001114449")
                .arg("现金")
                .arg(1500)
                .arg(1350)
                .arg("2013-03-13")
                .arg("2013-03-12")
                .arg(list.at(qrand() % 4));
    }

    // Put trs into the html's table.
    html.replace("#trs", trs);

    return html;
}

QString Widget::readHtmlPattern(const QString &path) const {
    // Pattern file.
    QFile htmlPatternFile(path);

    if (!htmlPatternFile.open(QIODevice::ReadOnly)) {
        qDebug() << QString("Can not find %1").arg(path);
        return "";
    }

    QString html = htmlPatternFile.readAll();

    // Close the files.
    htmlPatternFile.close();

    return html;
}
gucunlin 2013-07-02
  • 打赏
  • 举报
回复
已经解决了 跟大家一起分享 第一步 setPageSize(QPrinter::Custom); 第二步 设置大小的单位 setPaperSize(QSizeF(size.height(),size.width()),QPrinter::Point); 这里的第一个参数构造是QSizeF(qreal w, qreal h); 按说是第一个是宽第二个是高,早就这样用了,打出来确是非常偏的pdf,以为用错了。后来实在没办法了又试,感觉是不是宽和高反了。第一个传高度,第二个传宽度。问题解决
xcyl 2013-07-02
  • 打赏
  • 举报
回复
引用 2 楼 gucunlin 的回复:
我需要自定义的,导出的东西没有一定大小,随时会变的。最后一个是自定义,但是不知道怎么用。
先setPageSize(QPagePaintDevice::Custom); 再setPageSizeMM你自己想要的大小
gucunlin 2013-07-02
  • 打赏
  • 举报
回复
我需要自定义的,导出的东西没有一定大小,随时会变的。最后一个是自定义,但是不知道怎么用。
xcyl 2013-07-02
  • 打赏
  • 举报
回复

有这么多呢

16,815

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧