当前位置: 首页 > news >正文

QT 使用QPdfWriter和QPainter绘制PDF文件

QT如何生产pdf文件,网上有许多文章介绍,我也是看了网上的文章,看他们的代码,自己琢磨琢磨,才有了本编博客;

其他什么就不详细说了,本篇博客介绍的QPdfWriter和QPainter绘制PDF文件;对pdf这里是绘制出来的,没有什么规范的格式,都是通过xy坐标绘制出来的。

QPdfWriter类设置pdf的基础设置;QPainter类绘制文本,图片矩形等;

以下代码参考博客:Qt中使用QPdfWriter类结合QPainter类绘制并输出PDF文件-CSDN博客

自己稍微做了调整了修改!

反正得自己会QPainter绘制,否则你无法绘制pdf文件出来!!!

头文件:

#include <QPdfWriter>
#include <QDesktopServices>
#include <QtPrintSupport/QPrinter>
#include <QtPrintSupport/QtPrintSupport>

一、步骤

绘制pdf有以下步骤:

1.选择需要导出的pdf文件路径;

2.创建pdf文件;

3.创建生成pdf类,作为绘图设备;

4.绘制PDF;

5.查看绘制好的pdf。

void Widget::exportPdf()
{//一、选择保存pdf文件路径QString sPath = QFileDialog::getSaveFileName(this, tr("另存为"), "/", tr("Text Files (*.pdf)"));if(sPath.isEmpty()){return;}qDebug() << sPath;//二、创建pdf文件QFile pdfFile(sPath);pdfFile.open(QIODevice::WriteOnly);//三、创建生成pdf类,作为绘图设备QPdfWriter *pPdfWriter = new QPdfWriter(&pdfFile);pPdfWriter->setResolution(300);      // 将打印设备的分辨率设置为屏幕分辨率pPdfWriter->setPageSize(QPagedPaintDevice::A4);             // 设置纸张为A4纸pPdfWriter->setPageMargins(QMarginsF(30, 30, 30, 30));      // 设置页边距 顺序是:左上右下//四、开始绘制PDF//paintPdf(pPdfWriter);delete pPdfWriter;pdfFile.close();//通过其它PDF阅读器来打开刚刚绘制的PDFQDesktopServices::openUrl(QUrl::fromLocalFile(sPath));
}

二、效果展示

三、代码实现

#include "widget.h"
#include "ui_widget.h"#include <QFileDialog>
#include <QStandardPaths>
#include <QPdfWriter>
#include <QDebug>
#include <QDesktopServices>
#include <QMessageBox>
#include <QtPrintSupport/QPrinter>
#include <QtPrintSupport/QtPrintSupport>#include <pdfgenerator.h>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);createPDF();
}Widget::~Widget()
{delete ui;
}void Widget::createPDF()
{int y = 0;QString path = "/home/UOS/Desktop/3.pdf";PdfGenerator *pdfGenerator = new PdfGenerator;bool flag = pdfGenerator->setFileName(path);if (!flag) {return ;}int nPdfWidth = pdfGenerator->getPdfWidth();pdfGenerator->beginPage();QPixmap p;p.load(":/007.jpg");int pHeight = pdfGenerator->drawImage(QRectF(0, y, 150, 150), p);y += pHeight + 50;// 绘制表格y += 100;QFont f = QFont("宋体", 18, 36);QColor blackColor = QColor(0,0,0);pdfGenerator->drawRect(QRectF(0, y, nPdfWidth, 200), blackColor, 2, QColor(100, 0, 200, 50));pdfGenerator->drawText(QRectF(0, y, nPdfWidth, 200), "这是标题文本!", QFont("宋体", 32, 64));// 绘制科目y += 200;int nClassWidthFlag = nPdfWidth / (8);int nClassWidth = nClassWidthFlag;QList<QString> classList;classList << "语文" << "数学" << "英语" << "历史" << "政治" << "地理" << "音乐" << "体育";int classx = 0;for (int i = 0; i < classList.count(); i++) {pdfGenerator->drawRect(QRectF(classx, y, nClassWidth, 100), blackColor, 2);pdfGenerator->drawText(QRectF(classx, y, nClassWidth, 100), classList.at(i), QFont("宋体", 12, 20), QColor(200, 100, 100), Qt::AlignCenter);classx += nClassWidth;if (7 == i + 1) {int n = nPdfWidth - (classx + nClassWidth);nClassWidth += n;}}// 绘制个人信息y += 100;int nPersonDescriptionWidth = nClassWidthFlag * 2;QList<QList<QString>> descriptionList;QList<QString> list;list << "小米" << "男" << "15";descriptionList << list;list.clear();list << "小明" << "男" << "20";descriptionList << list;list.clear();list << "小红" << "女" << "21";descriptionList << list;list.clear();list << "姓名" << "性别" << "年龄";int nPersonDescriptionHeight = 120 + descriptionList.count() * 100;pdfGenerator->drawRect(QRect(0, y, nPersonDescriptionWidth, nPersonDescriptionHeight));pdfGenerator->drawText(QRect(0, y, nPersonDescriptionWidth, nPersonDescriptionHeight), "个人信息",QFont("宋体", 20, 40), QColor(100, 100, 255));int nMessageX = nPersonDescriptionWidth;int nMessageWidth = nPersonDescriptionWidth;for (int i = 0; i < list.count(); i++) {pdfGenerator->drawRect(QRect(nMessageX, y, nMessageWidth, 120));pdfGenerator->drawText(QRect(nMessageX, y, nMessageWidth, 120), list.at(i), QFont("宋体", 18, 30), QColor(200, 50, 50));nMessageX += nPersonDescriptionWidth;if (list.count()-1 == i + 1) {int n = nPdfWidth - (nMessageX + nPersonDescriptionWidth);nMessageWidth += n;}}y += 120;int nPersonX = nPersonDescriptionWidth;int nPersonWidth = nPersonDescriptionWidth;for (int i = 0; i < descriptionList.count(); ++i) {QList<QString> list = descriptionList.at(i);for (int j = 0; j < list.count(); ++j) {pdfGenerator->drawRect(QRect(nPersonX, y, nPersonWidth, 100));pdfGenerator->drawText(QRect(nPersonX, y, nPersonWidth, 100), list.at(j), pdfGenerator->getBaseFont());nPersonX += nPersonDescriptionWidth;if (list.count()-1 == j + 1) {int n = nPdfWidth - (nPersonX + nPersonDescriptionWidth);nPersonWidth += n;}}y += 100;nPersonX = nPersonDescriptionWidth;nPersonWidth = nPersonDescriptionWidth;}// 绘制详细信息descriptionList.clear();list.clear();list << "小明" << "swim" << "擅长蛙泳" << "170cm";descriptionList << list;list.clear();list << "小红" << "dance" << "街舞鼻祖" << "160cm";descriptionList << list;list.clear();list << "小黄" << "run" << "短跑小王子" << "166cm";descriptionList << list;list.clear();list << "小绿" << "jump" << "跳高运动员" << "196cm";descriptionList << list;list.clear();list << "姓名" << "爱好" << "特点" << "身高";int nDetailedInformationWidth = nClassWidthFlag * 2;int nDetailedInformationHeight = 120 + descriptionList.count() * 100;pdfGenerator->drawRect(QRect(0, y, nDetailedInformationWidth, nDetailedInformationHeight));pdfGenerator->drawText(QRect(0, y, nDetailedInformationWidth, nDetailedInformationHeight), "详细信息",QFont("宋体", 20, 40), QColor(100, 100, 255));int nInformationTotalWidth = nPdfWidth - nDetailedInformationWidth;int nInformationOneWidth = nInformationTotalWidth / descriptionList.count();int nDetailedX = nDetailedInformationWidth;int nDetailedWidth = nInformationOneWidth;for (int i = 0; i < list.count(); i++) {pdfGenerator->drawRect(QRect(nDetailedX, y, nDetailedWidth, 120));pdfGenerator->drawText(QRect(nDetailedX, y, nDetailedWidth, 120), list.at(i), QFont("宋体", 20, 30));nDetailedX += nDetailedWidth;if (list.count()-1 == i + 1) {int n = nPdfWidth - (nDetailedX + nDetailedWidth);nDetailedWidth += n;}}y += 120;int nInformationX = nDetailedInformationWidth;int nInformationWidth = nInformationOneWidth;for (int i = 0; i < descriptionList.count(); ++i) {QList<QString> list = descriptionList.at(i);for (int j = 0; j < list.count(); ++j) {pdfGenerator->drawRect(QRect(nInformationX, y, nInformationWidth, 100));pdfGenerator->drawText(QRect(nInformationX, y, nInformationWidth, 100), list.at(j),pdfGenerator->getBaseFont(), QColor(200,0,0));nInformationX += nInformationWidth;if (list.count()-1 == j + 1) {int n = nPdfWidth - (nInformationX + nInformationWidth);nInformationWidth += n;}}y += 100;nInformationX = nDetailedInformationWidth;nInformationWidth = nInformationOneWidth;}y += 50;pdfGenerator->drawPolygon(QRect(600, y, 800, 600));pdfGenerator->drawRect(QRect(600, y, 800, 600));// 换页//    if(y + 100 >= pdfGenerator->getPdfHeight()) {//        pdfGenerator->newPage();//        y = 10;//    }pdfGenerator->newPage();y = 0;/************************************************************************************************************/// 外部大矩形框pdfGenerator->drawRect(QRect(0, y, nPdfWidth, pdfGenerator->getPdfHeight()), QColor(0,0,0), 8);// 左上角m级f = pdfGenerator->getBaseFont();f.setBold(true);f.setPointSize(13);pdfGenerator->drawText(QRectF(10, y, 360, 100), "m级:非m", f, QColor(0,0,0), Qt::AlignLeft);// 页码int pageX = 900;f = pdfGenerator->getBaseFont("宋体", 12, 0);pdfGenerator->drawText(QRectF(pageX, y, 500, 100), "第 1 页   Page", f, QColor(0,0,0), Qt::AlignLeft);y += 80;pdfGenerator->drawText(QRectF(pageX, y, 1444, 100), "共 2 页   This report includes page", f, QColor(0,0,0), Qt::AlignLeft);y += 100;// 标题1f = pdfGenerator->getBaseFont("宋体", 20, 8);pdfGenerator->drawText(QRectF(0, y, nPdfWidth, 120), "嘻嘻嘻这是一份关于检测相关的世界的详细报告哈哈", f, QColor(0,0,0), Qt::AlignCenter);y += 120;// 标题1英语f = pdfGenerator->getBaseFont("Times New Roman", 11, 8);QString english = "abc abc He he he, this is a detailed report about the world related to testing. Ha ha. abc abc";pdfGenerator->drawText(QRectF(0, y, nPdfWidth, 120), english, f, QColor(0,0,0), Qt::AlignCenter);y += 150;// 标题2f = pdfGenerator->getBaseFont("宋体", 30, 8);pdfGenerator->drawText(QRectF(0, y, nPdfWidth, 130), "一二三四五六报告", f, QColor(0,0,0), Qt::AlignCenter);y += 160;// 标题2英语f = pdfGenerator->getBaseFont("Times New Roman", 20, 12);pdfGenerator->drawText(QRectF(0, y, nPdfWidth, 130), "Tihs is a Report", f, QColor(0,0,0), Qt::AlignCenter);y += 160;// 报告编号f = pdfGenerator->getBaseFont("宋体", 10, 0);pdfGenerator->drawText(QRectF(0, y, nPdfWidth, 50), "报告编号:( 2025 )报告的 第 15 号", f, QColor(0,0,0), Qt::AlignCenter);y += 80;// Report No.f = pdfGenerator->getBaseFont("Times New Roman", 10, 0);pdfGenerator->drawText(QRectF(0, y, nPdfWidth, 50), "Report No.", f, QColor(0,0,0), Qt::AlignCenter);int nameX = 200;    // 距离左边的距离int lineX = 500;    // 横线距离左边的距离int lineWidth = 1322;    // 横线宽度y += 100;for (int i = 0; i < 6; i++) {int tmpY = y + 30;// 你的名称f = pdfGenerator->getBaseFont();pdfGenerator->drawText(QRectF(nameX, y, 250, 60), "你的名称:", f, QColor(0,0,0), Qt::AlignLeft);y += 80;// 英文f = pdfGenerator->getBaseFont("Times New Roman", 10, 0);pdfGenerator->drawText(QRectF(nameX, y, 250, 60), "Your name", f, QColor(0,0,0), Qt::AlignLeft);y += 70;// 画横线f = pdfGenerator->getBaseFont();pdfGenerator->drawLine(QPointF(lineX, y), QPointF(lineX + lineWidth, y));// 画文本pdfGenerator->drawText(QRectF(lineX, tmpY, lineWidth, 80), "这是名字呀", f, QColor(0,0,0), Qt::AlignCenter);y += 30;// 自动换页处理
//        if(y + 200 >= pdfGenerator->getPdfHeight()) {
//            pdfGenerator->newPage();
//            y = 10;
//        }}y += 50;// 签发人f = pdfGenerator->getBaseFont();pdfGenerator->drawText(QRectF(nameX, y, 400, 60), "签发人:(签字)", f, QColor(0,0,0), Qt::AlignLeft);int dataX = 1111;// 发证日期f = pdfGenerator->getBaseFont();pdfGenerator->drawText(QRectF(dataX, y, 400, 60), "发证日期:", f, QColor(0,0,0), Qt::AlignLeft);y += 90;// 签发人 英文f = pdfGenerator->getBaseFont("Times New Roman", 10);pdfGenerator->drawText(QRectF(nameX, y, 400, 60), "Signature of leader", f, QColor(0,0,0), Qt::AlignLeft);// 发证日期 英文f = pdfGenerator->getBaseFont("Times New Roman", 10);pdfGenerator->drawText(QRectF(dataX, y, 400, 60), "lssued date", f, QColor(0,0,0), Qt::AlignLeft);y += 200;// 发证单位f = pdfGenerator->getBaseFont();pdfGenerator->drawText(QRectF(dataX, y, 600, 60), "发证单位:(盖章位置)", f, QColor(0,0,0), Qt::AlignLeft);y += 90;// 发证单位 英文f = pdfGenerator->getBaseFont("Times New Roman", 10);pdfGenerator->drawText(QRectF(dataX, y, 400, 60), "lssued by(stamp)", f, QColor(0,0,0), Qt::AlignLeft);y += 200;// 地址f = pdfGenerator->getBaseFont("宋体", 10);f.setBold(true);pdfGenerator->drawText(QRectF(nameX, y, 600, 66), "地址(Add):", f, QColor(0,0,0), Qt::AlignLeft);f = pdfGenerator->getBaseFont("宋体", 10);pdfGenerator->drawText(QRectF(nameX + 330, y, 800, 66), "广东省广州市天河区xx街道xx村xx号", f, QColor(0,0,0), Qt::AlignLeft);// 邮编f = pdfGenerator->getBaseFont("宋体", 10);f.setBold(true);pdfGenerator->drawText(QRectF(nameX + 1100, y, 600, 66), "邮编(Post Code):", f, QColor(0,0,0), Qt::AlignLeft);f = pdfGenerator->getBaseFont("宋体", 10);pdfGenerator->drawText(QRectF(nameX + 1550, y, 300, 66), "123456", f, QColor(0,0,0), Qt::AlignLeft);y += 100;// 电话f = pdfGenerator->getBaseFont("宋体", 10);f.setBold(true);pdfGenerator->drawText(QRectF(nameX, y, 600, 66), "电话(Tel):", f, QColor(0,0,0), Qt::AlignLeft);f = pdfGenerator->getBaseFont("宋体", 10);pdfGenerator->drawText(QRectF(nameX + 330, y, 800, 66), "002-123456789", f, QColor(0,0,0), Qt::AlignLeft);// 传真f = pdfGenerator->getBaseFont("宋体", 10);f.setBold(true);pdfGenerator->drawText(QRectF(nameX + 800, y, 600, 66), "传真(Fax):", f, QColor(0,0,0), Qt::AlignLeft);f = pdfGenerator->getBaseFont("宋体", 10);pdfGenerator->drawText(QRectF(nameX + 1050, y, 300, 66), "002-123456789", f, QColor(0,0,0), Qt::AlignLeft);y += 100;// 电子邮箱f = pdfGenerator->getBaseFont("宋体", 10);f.setBold(true);pdfGenerator->drawText(QRectF(nameX, y, 600, 66), "电子信箱(E-mail):", f, QColor(0,0,0), Qt::AlignLeft);f = pdfGenerator->getBaseFont("宋体", 10);pdfGenerator->drawText(QRectF(nameX + 400, y, 800, 66), "youxiang666@qq.com", f, QColor(0,0,0), Qt::AlignLeft);pdfGenerator->endPage();// 通过其它PDF阅读器来打开刚刚绘制的PDFQDesktopServices::openUrl(QUrl::fromLocalFile(path));
}

四、源码分享

pdfgenerator.h

#ifndef PDF_GENERATOR_H
#define PDF_GENERATOR_H#include <QObject>
#include <QPdfWriter>
#include <QPainter>
#include <QFont>
#include <QImage>
#include <QPageSize>
#include <QFile>class PdfGenerator : public QObject {Q_OBJECT
public:explicit PdfGenerator(const QString &fileName, QPagedPaintDevice::PageSize size = QPagedPaintDevice::PageSize::A4, QObject *parent = nullptr);explicit PdfGenerator(QObject *parent = nullptr);~PdfGenerator();qreal getPdfWidth();qreal getPdfHeight();/*** @brief getBaseFont   获得基本的字体* @param family* @param pointSize* @param weight* @return*/QFont getBaseFont(const QString &family = "宋体", int pointSize = 12, int weight = -1);/*** @brief setMargins    设置pdf边距,分别是 左-上-右-下* @param left* @param top* @param right* @param bottom*/void setMargins(qreal left, qreal top, qreal right, qreal bottom);/*** @brief setResolution     设置分辨率,一般为300* @param dpi*/void setResolution(int dpi = 300);/*** @brief newPage           新建下一页*/void newPage();/*** @brief beginPage         开始绘画* @return      成功返回true;失败返回false*/bool beginPage();/*** @brief endPage           结束会话* @return      成功返回true;失败返回false*/bool endPage();/*** @brief setFileName       设置pdf文件名,内部会open* @param fileName* @param size* @return*/bool setFileName(const QString &fileName, QPagedPaintDevice::PageSize size = QPagedPaintDevice::PageSize::A4);/*** @brief drawLine  绘制线段* @param start     起始坐标* @param end       结束坐标* @param color     线段颜色* @param width     线段宽度*/void drawLine(const QPointF &start, const QPointF &end, const QColor &color = QColor(0,0,0), qreal width = 2);/*** @brief drawText  绘制文字* @param rect      绘制的位置(矩形)* @param text      绘制的文本* @param font      绘制字体* @param color     字体颜色* @param align     对齐*/void drawText(const QRectF &rect, const QString &text, const QFont &font, const QColor &color = QColor(0,0,0), Qt::Alignment align = Qt::AlignCenter);/*** @brief drawImage             绘制图片* @param rect                  绘制的位置(矩形)* @param imagePath             图片路径*/int drawImage(const QRectF &rect, const QString &imagePath);int drawImage(const QRectF &rect, const QPixmap &pixmap);int drawImage(const QRectF &rect, const QImage &image);/*** @brief drawRect          绘制矩形* @param rect              绘制的位置(矩形)* @param borderColor       边框的颜色* @param borderWidth       边框宽度* @param fillColor         填充的颜色,默认透明,不填充*/void drawRect(const QRectF &rect, const QColor &borderColor = QColor(0,0,0), qreal borderWidth = 2, const QColor &fillColor = Qt::transparent);/*** @brief drawEllipse       绘制椭圆* @param rect              绘制的位置(矩形)* @param borderColor       边框的颜色* @param borderWidth       边框宽度* @param fillColor         填充的颜色,默认透明,不填充*/void drawEllipse(const QRectF &rect, const QColor &borderColor = QColor(0,0,0), qreal borderWidth = 2, const QColor &fillColor = Qt::transparent);/*** @brief drawPolygon       画三角形,三角形在矩形区域内* @param rect              绘制的位置(矩形)* @param borderColor       边框的颜色* @param borderWidth       边框宽度* @param fillColor         填充的颜色,默认透明,不填充*/void drawPolygon(const QRectF &rect, const QColor &borderColor = QColor(0,0,0), qreal borderWidth = 2, const QColor &fillColor = Qt::transparent);// 想设计其他绘制接口继续往下加private:QPdfWriter *m_writer = nullptr;QPainter *m_painter = nullptr;/// pdf可绘制区域QRect m_pageRect;/// pdf文件QFile m_pdfFile;
};#endif  // PDF_GENERATOR_H

pdfgenerator.cpp

#include "pdfgenerator.h"
#include <QtDebug>PdfGenerator::PdfGenerator(const QString &fileName, QPagedPaintDevice::PageSize size, QObject *parent) : QObject (parent)
{m_pdfFile.setFileName(fileName);m_writer = new QPdfWriter(&m_pdfFile);m_writer->setPageSize(size);                // 设置纸张m_writer->setResolution(300);               // 设置分辨率m_writer->setPageMargins(QMarginsF(20, 20, 20, 20), QPageLayout::Millimeter);   // 设置页边距m_pageRect = m_writer->pageLayout().paintRectPixels(m_writer->resolution());// 计算可绘制区域m_pageRect = QRect(0, 0, m_writer->width(), m_writer->height());if(!m_pdfFile.open(QIODevice::WriteOnly))return ;}PdfGenerator::PdfGenerator(QObject *parent) : QObject (parent)
{}PdfGenerator::~PdfGenerator()
{if (m_painter) {if (m_painter->isActive()){m_painter->end();}delete m_painter;}if (m_writer) {m_writer->deleteLater();}
}qreal PdfGenerator::getPdfWidth()
{return m_pageRect.width();
}qreal PdfGenerator::getPdfHeight()
{return m_pageRect.height();
}QFont PdfGenerator::getBaseFont(const QString &family, int pointSize, int weight)
{QFont f(family, pointSize, weight);return f;
}void PdfGenerator::setMargins(qreal left, qreal top, qreal right, qreal bottom)
{m_writer->setPageMargins(QMarginsF(left, top, right, bottom), QPageLayout::Millimeter);m_pageRect = m_writer->pageLayout().paintRectPixels(m_writer->resolution()); // 更新绘制区域
}void PdfGenerator::setResolution(int dpi)
{m_writer->setResolution(dpi);
}void PdfGenerator::newPage()
{// 创建新页m_writer->newPage();
}bool PdfGenerator::beginPage()
{bool bRet = false;if(nullptr == m_painter){m_painter = new QPainter(m_writer);}//启用抗锯齿m_painter->setRenderHint(QPainter::Antialiasing);if (nullptr != m_painter){m_painter->begin(m_writer);//m_painter->reset(new  QPainter(m_writer.data()));bRet = m_painter->isActive();}qDebug() << "beginPage bRet is " << bRet;return bRet;
}bool PdfGenerator::endPage() {if (m_painter && m_painter->isActive()){m_painter->end();m_writer->deleteLater();m_pdfFile.close();return true;}m_pdfFile.close();return false;
}bool PdfGenerator::setFileName(const QString &fileName, QPagedPaintDevice::PageSize size)
{m_pdfFile.setFileName(fileName);// 打开创建并以写的方式打开文件if(!m_pdfFile.open(QIODevice::WriteOnly | QIODevice::Truncate)) {return false;}m_writer = new QPdfWriter(&m_pdfFile);m_writer->setPageSize(size);                // 设置纸张m_writer->setResolution(300);               // 设置分辨率m_writer->setPageMargins(QMarginsF(20, 20, 20, 20), QPageLayout::Millimeter);   // 设置页边距m_pageRect = m_writer->pageLayout().paintRectPixels(m_writer->resolution());// 计算可绘制区域m_pageRect = QRect(0, 0, m_writer->width(), m_writer->height());return true;
}// 绘制线段
void PdfGenerator::drawLine(const QPointF &start, const QPointF &end, const QColor &color, qreal width)
{if (!m_painter->isActive())return;m_painter->save();m_painter->setPen(QPen(color, width));m_painter->drawLine(start, end);m_painter->restore();
}// 绘制文本(支持对齐)
void PdfGenerator::drawText(const QRectF &rect, const QString &text, const QFont &font, const QColor &color, Qt::Alignment align)
{if (!m_painter->isActive())return;m_painter->save();m_painter->setFont(font);m_painter->setPen(color);m_painter->drawText(rect, static_cast<int>(align), text);m_painter->restore();
}// 绘制图片(根据大小比例,来放大缩小图片)
int PdfGenerator::drawImage(const QRectF &rect, const QString &imagePath)
{if (!m_painter->isActive())return -10;QPixmap pixmap;if (!pixmap.load(imagePath)) {return -1;}int nPdfWidth = m_pageRect.width();int imageBorder = rect.width();float x = (float)(nPdfWidth - imageBorder * 2) / (float)pixmap.width();pixmap = pixmap.scaled(nPdfWidth - imageBorder * 2, x * pixmap.height(), Qt::IgnoreAspectRatio);    //根据大小比例,来放大缩小图片m_painter->drawPixmap(imageBorder, static_cast<int>(rect.y()), pixmap);return pixmap.height();
}int PdfGenerator::drawImage(const QRectF &rect, const QPixmap &pixmap)
{if (!m_painter->isActive())return -1;if (pixmap.isNull())return -1;int nPdfWidth = m_pageRect.width();int imageBorder = rect.width();float x = (float)(nPdfWidth - imageBorder * 2) / (float)pixmap.width();QPixmap pixmapTmp = pixmap.scaled(nPdfWidth - imageBorder * 2, x * pixmap.height(), Qt::IgnoreAspectRatio);    //根据大小比例,来放大缩小图片m_painter->drawPixmap(imageBorder, static_cast<int>(rect.y()), pixmapTmp);return pixmapTmp.height();
}int PdfGenerator::drawImage(const QRectF &rect, const QImage &image)
{if (!m_painter->isActive())return -1;if (image.isNull())return -1;int nPdfWidth = m_pageRect.width();int imageBorder = rect.width();float x = (float)(nPdfWidth - imageBorder * 2) / (float)image.width();QImage imageTmp = image.scaled(nPdfWidth - imageBorder * 2, x * image.height(), Qt::IgnoreAspectRatio);    //根据大小比例,来放大缩小图片m_painter->drawImage(rect, image);return image.height();
}// 绘制矩形(支持填充)
void PdfGenerator::drawRect(const QRectF &rect, const QColor &borderColor, qreal borderWidth, const QColor &fillColor)
{if (!m_painter->isActive())return;m_painter->save();m_painter->setBrush(QBrush(fillColor));     // 填充m_painter->setPen(QPen(borderColor, borderWidth));m_painter->drawRect(rect);m_painter->restore();
}// 绘制椭圆
void PdfGenerator::drawEllipse(const QRectF &rect, const QColor &borderColor, qreal borderWidth, const QColor &fillColor)
{if (!m_painter->isActive())return;m_painter->save();m_painter->setBrush(QBrush(fillColor));m_painter->setPen(QPen(borderColor, borderWidth));m_painter->drawEllipse(rect);m_painter->restore();
}void PdfGenerator::drawPolygon(const QRectF &rect, const QColor &borderColor, qreal borderWidth, const QColor &fillColor)
{if (!m_painter->isActive())return;QPen pen(borderColor, borderWidth); // 底边线宽为5m_painter->setPen(pen);QBrush brush(fillColor);m_painter->setBrush(brush);QPoint points[3] = {QPoint(rect.x(), rect.y() + rect.height()), // 左下角点QPoint(rect.x() + rect.width(), rect.y() + rect.height()), // 右下角点QPoint((rect.width() + rect.x() + rect.x()) / 2, rect.y()) // 上顶点};m_painter->drawPolygon(points, 3);
}

http://www.xdnf.cn/news/456031.html

相关文章:

  • 2025最新ChatGPT Plus令牌(Token)限制完全指南:每日/每月用量详解与突破方法
  • 浏览器自动化:RPA 解决方案的崛起
  • [Harmony]封装一个可视化的数据持久化工具
  • Aquatone安装与使用
  • 科学养生指南:解锁健康生活的密码
  • Kind方式部署k8s单节点集群并创建nginx服务对外访问
  • 渗透测试流程-上篇
  • 养生:解锁健康生活的核心密码
  • 磁盘I/O瓶颈排查:面试通关“三部曲”心法
  • Python logging模块使用指南
  • 争对机器学习和深度学习里Python项目开发管理项目依赖的工具中方便第三方库和包的安装
  • 用FileCodeBox打造私有文件传输:Ubuntu环境保姆级部署教程!
  • 《C++ vector详解》
  • Python----神经网络(基于DNN的风电功率预测)
  • GpuGeek:为创新者提供灵活、快速、高效的云计算服务!
  • PHP基础知识
  • 以项目的方式学QT开发(二)
  • Apple Vision Pro空间视频创作革命:从180度叙事到沉浸式语法的重构——《Adventure》系列幕后技术深度解析
  • AI浪潮:开启科技新纪元
  • 数据分析NumPy
  • wps excel将表格输出pdf时所有列在一张纸上
  • RabbitMQ 消息模式实战:从简单队列到复杂路由(一)
  • 数据可视化-----子图的绘制及坐标轴的共享
  • C语言经典笔试题目分析(持续更新)
  • conda更换清华源
  • Spring Cloud探索之旅:从零搭建微服务雏形 (Eureka, LoadBalancer 与 OpenFeign实战)
  • Synchronized详解及高频面试问答
  • CSRF 和 XSS 攻击分析与防范
  • Python爬虫第21节- 基础图形验证码识别实战
  • 前端的面试笔记——JavaScript篇(二)