您的位置:首页 > Web前端 > CSS

Qt利用QGraphicsScene编写Word排版工具导出PDF

2016-05-05 23:13 686 查看
自定义Graphics图形系统
QTEGraphicsItem

QTEGraphicsScene

Word排版工具
QTEWordExpress

QTEReport

本篇的目的是编写一个工具,能够方便的对富文本、表格、图片生成Report和导出PDF,并且必须要在ARM、MIPS平台的linux嵌入式系统中方便使用。

自定义Graphics图形系统

Graphic系统,可以良好的完成图形的编辑工作和显示工作,但是在嵌入式板子上并不能良好的工作,因为内部绘图机制在嵌入式屏幕上存在很大的失真问题。

QTEGraphicsItem

QTEGraphicsItem.h

#ifndef QTEGRAPHICSITEM_H
#define QTEGRAPHICSITEM_H

#include <QGraphicsItem>
#include <QGraphicsProxyWidget>

class QTEGraphicsItem : public QGraphicsItem
{
public:
explicit QTEGraphicsItem(QTEGraphicsItem *parent = 0);

};

class QTEGraphicsTextItem : public QGraphicsTextItem
{
public:
explicit QTEGraphicsTextItem(QTEGraphicsItem *parent = 0);

// QGraphicsItem interface
public:
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
};

class QTEGraphicsSimpleTextItem : public QGraphicsSimpleTextItem
{
public:
explicit QTEGraphicsSimpleTextItem(QTEGraphicsItem *parent = 0);

};

class QTEGraphicsPixmapItem : public QGraphicsPixmapItem
{
public:
explicit QTEGraphicsPixmapItem(QTEGraphicsItem *parent = 0);

};

class QTEGraphicsRectItem : public QGraphicsRectItem
{
public:
explicit QTEGraphicsRectItem(QTEGraphicsItem *parent = 0);

// QGraphicsItem interface
public:
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
};

class QTEGraphicsLineItem : public QGraphicsLineItem
{
public:
explicit QTEGraphicsLineItem(QTEGraphicsItem *parent = 0);

// QGraphicsItem interface
public:
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
};

class QTEGraphicsPathItem : public QGraphicsPathItem
{
public:
explicit QTEGraphicsPathItem(QTEGraphicsItem *parent = 0);

};

class QTEGraphicsEllipseItem : public QGraphicsEllipseItem
{
public:
explicit QTEGraphicsEllipseItem(QTEGraphicsItem *parent = 0);

};

class QTEGraphicsPolygonItem : public QGraphicsPolygonItem
{
public:
explicit QTEGraphicsPolygonItem(QTEGraphicsItem *parent = 0);

};

class QTEGraphicsItemGroup : public QGraphicsItemGroup
{
public:
explicit QTEGraphicsItemGroup(QTEGraphicsItem *parent = 0);

};

class QTEGraphicsProxyWidget : public QGraphicsProxyWidget
{
public:
explicit QTEGraphicsProxyWidget(QTEGraphicsItem *parent = 0);

};

#endif // QTEGRAPHICSITEM_H


QTEGraphicsItem.cpp

#include "hngraphicsitem.h"
#include <QPainter>
#include <QStyleOptionGraphicsItem>
#include "QTEDefine.h"

QTEGraphicsItem::QTEGraphicsItem(QTEGraphicsItem *parent) : QGraphicsItem(parent) {}

QTEGraphicsTextItem::QTEGraphicsTextItem(QTEGraphicsItem *parent) : QGraphicsTextItem(parent) {}

QTEGraphicsRectItem::QTEGraphicsRectItem(QTEGraphicsItem *parent) : QGraphicsRectItem(parent) {}

QTEGraphicsSimpleTextItem::QTEGraphicsSimpleTextItem(QTEGraphicsItem *parent) : QGraphicsSimpleTextItem(parent) {}

QTEGraphicsLineItem::QTEGraphicsLineItem(QTEGraphicsItem *parent) : QGraphicsLineItem(parent) {}

QTEGraphicsPixmapItem::QTEGraphicsPixmapItem(QTEGraphicsItem *parent) : QGraphicsPixmapItem(parent) {}

QTEGraphicsPathItem::QTEGraphicsPathItem(QTEGraphicsItem *parent) : QGraphicsPathItem(parent) {}

QTEGraphicsEllipseItem::QTEGraphicsEllipseItem(QTEGraphicsItem *parent) : QGraphicsEllipseItem(parent) {}

QTEGraphicsPolygonItem::QTEGraphicsPolygonItem(QTEGraphicsItem *parent) : QGraphicsPolygonItem(parent) {}

QTEGraphicsItemGroup::QTEGraphicsItemGroup(QTEGraphicsItem *parent) : QGraphicsItemGroup(parent) {}

QTEGraphicsProxyWidget::QTEGraphicsProxyWidget(QTEGraphicsItem *parent) : QGraphicsProxyWidget(parent) {}

void QTEGraphicsTextItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
QFont oldFont(painter->font());

painter->setFont(font());
//painter->fillRect(option->rect, Qt::SolidPattern);
painter->drawText(option->rect, Qt::AlignCenter, toPlainText());

if (option->state & (QStyle::State_Selected | QStyle::State_HasFocus))
;

if(toPlainText().contains("K1160"))
{
pline() << font().pointSize() << font().pixelSize();
pline() << pos() << option->rect << option->exposedRect << toPlainText();
pline() << option->matrix << option->matrix.mapRect(option->rect);
}
painter->setFont(oldFont);
}

void QTEGraphicsLineItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
QPen oldPen(painter->pen());

qreal xratio = option->rect.width() / option->exposedRect.width();
qreal yratio = option->rect.height() / option->exposedRect.height();

QPen pn = pen();
pn.setWidth(pn.width()*xratio);
painter->setPen(pn);

QLineF l = QLineF(option->rect.left(), option->rect.top(),
option->rect.right(), option->rect.top());

painter->drawLine(l);
if(0)
{
pline() << line() << l << option->rect << option->exposedRect;
pline() << option->matrix << option->matrix.mapRect(option->rect);
}

painter->setPen(oldPen);
}

void QTEGraphicsRectItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
QPen oldPen(painter->pen());
QBrush oldBrush(painter->brush());

qreal xratio = option->rect.width() / option->exposedRect.width();
qreal yratio = option->rect.height() / option->exposedRect.height();

QPen pn = pen();
pn.setWidth(pn.width()*xratio);
painter->setPen(pn);

QRectF r = QRectF(option->rect.left(), option->rect.top(),
option->r
17bc0
ect.width(), option->rect.height());

painter->setBrush(brush());
painter->drawRect(r);

if(0)
{
pline() << option->matrix << option->matrix.mapRect(option->rect) << r;
}

painter->setPen(oldPen);
painter->setBrush(oldBrush);
}


QTEGraphicsScene

QTEGraphicsScene.h

#ifndef QTEGRAPHICSSCENE_H
#define QTEGRAPHICSSCENE_H

#include <QGraphicsScene>
#include "hngraphicsitem.h"

class QTEGraphicsScene : public QGraphicsScene
{
Q_OBJECT
public:
QTEGraphicsScene(QObject *parent = 0);
QTEGraphicsScene(const QRectF &sceneRect, QObject *parent = 0);
QTEGraphicsScene(qreal x, qreal y, qreal width, qreal height, QObject *parent = 0);
virtual ~QTEGraphicsScene() {}

void render(QPainter *painter,
const QRectF &target = QRectF(), const QRectF &source = QRectF(),
Qt::AspectRatioMode aspectRatioMode = Qt::KeepAspectRatio);
QTEGraphicsEllipseItem *addEllipse(const QRectF &rect, const QPen &pen = QPen(), const QBrush &brush = QBrush());
inline QGraphicsEllipseItem *addEllipse(qreal x, qreal y, qreal w, qreal h, const QPen &pen = QPen(), const QBrush &brush = QBrush())
{ return addEllipse(QRectF(x, y, w, h), pen, brush); }

QTEGraphicsPathItem *addPath(const QPainterPath &path, const QPen &pen = QPen(), const QBrush &brush = QBrush());
QTEGraphicsPixmapItem *addPixmap(const QPixmap &pixmap);
QTEGraphicsPolygonItem *addPolygon(const QPolygonF &polygon, const QPen &pen = QPen(), const QBrush &brush = QBrush());
QTEGraphicsTextItem *addText(const QString &text, const QFont &font = QFont());
QTEGraphicsSimpleTextItem *addSimpleText(const QString &text, const QFont &font = QFont());
QTEGraphicsProxyWidget *addWidget(QWidget *widget, Qt::WindowFlags wFlags = 0);
QTEGraphicsLineItem *addLine(const QLineF &line, const QPen &pen = QPen());
inline QTEGraphicsLineItem *addLine(qreal x1, qreal y1, qreal x2, qreal y2, const QPen &pen = QPen())
{ return addLine(QLineF(x1, y1, x2, y2), pen); }
QTEGraphicsRectItem *addRect(const QRectF &rect, const QPen &pen = QPen(), const QBrush &brush = QBrush());
inline QTEGraphicsRectItem *addRect(qreal x, qreal y, qreal w, qreal h, const QPen &pen = QPen(), const QBrush &brush = QBrush())
{ return addRect(QRectF(x, y, w, h), pen, brush); }

signals:

public slots:

// QGraphicsScene interface
protected:
void drawItems(QPainter *painter, int numItems, QGraphicsItem *items[], const QStyleOptionGraphicsItem options[], QWidget *widget = 0);

private:
};

#endif // QTEGRAPHICSSCENE_H


QTEGraphicsScene.cpp

#include "hngraphicsscene.h"
#include <QGraphicsItem>
#include <QPainter>
#include "QTEDefine.h"

QTEGraphicsScene::QTEGraphicsScene(QObject *parent) :
QGraphicsScene(parent)
{
}

QTEGraphicsScene::QTEGraphicsScene(const QRectF &sceneRect, QObject *parent) :
QGraphicsScene(sceneRect, parent)
{

}

QTEGraphicsScene::QTEGraphicsScene(qreal x, qreal y, qreal width, qreal height, QObject *parent) :
QGraphicsScene(x, y, width, height, parent)
{

}

/**
* @brief QTEGraphicsScene::render
* 经过测试,失真是由于render放缩QPainter和drawItems里面的itemPaint共同导致失真
* 现在规整理如下,原则:Qpainter不允许改变
* 重写itemPaint函数
* @param painter
* @param target
* @param source
* @param aspectRatioMode
*/
void QTEGraphicsScene::render(QPainter *painter, const QRectF &target, const QRectF &source, Qt::AspectRatioMode aspectRatioMode)
{
// Find the ideal x / y scaling ratio to fit a source into a target.
QRectF sourceRect = sceneRect();
QRectF targetRect = sourceRect;
if(!source.isEmpty())
sourceRect = source;
if(!target.isEmpty())
targetRect = target;

qreal xratio = targetRect.width() / sourceRect.width();
qreal yratio = targetRect.height() / sourceRect.height();

QList<QGraphicsItem *> itemList = items();
QGraphicsItem **itemArray = new QGraphicsItem *[itemList.size()];
int numItems = itemList.size();
for (int i = 0; i < numItems; ++i)
itemArray[numItems - i - 1] = itemList.at(i);
itemList.clear();

painter->save();

// Generate the style options
QStyleOptionGraphicsItem *styleOptionArray = new QStyleOptionGraphicsItem[numItems];
for (int i = 0; i < numItems; ++i) {
QGraphicsItem *item = itemArray[i];
QStyleOptionGraphicsItem option;
option.state = QStyle::State_None;
if (item->isSelected())
option.state |= QStyle::State_Selected;
if (item->isEnabled())
option.state |= QStyle::State_Enabled;
if (item->hasFocus())
option.state |= QStyle::State_HasFocus;
if (item == mouseGrabberItem())
option.state |= QStyle::State_Sunken;

option.exposedRect = item->boundingRect();

option.rect.setLeft(item->pos().x()*xratio);
option.rect.setWidth(option.exposedRect.width()*xratio);
option.rect.setTop(item->pos().y()*yratio);
option.rect.setHeight(option.exposedRect.height()*yratio);

//pline() << xratio << yratio << item->pos() << option.rect << option.exposedRect;

styleOptionArray[i] = option;
}
// Render the scene.
drawBackground(painter, targetRect);
drawItems(painter, numItems, itemArray, styleOptionArray);
drawForeground(painter, targetRect);
delete [] itemArray;
delete [] styleOptionArray;

painter->restore();
}

QTEGraphicsTextItem *QTEGraphicsScene::addText(const QString &text, const QFont &font)
{
QTEGraphicsTextItem* item = new QTEGraphicsTextItem;
item->setFont(font);
item->setPlainText(text);
addItem(item);
return item;
}

QTEGraphicsRectItem *QTEGraphicsScene::addRect(const QRectF &rect, const QPen &pen, const QBrush &brush)
{
QTEGraphicsRectItem* item = new QTEGraphicsRectItem;
item->setRect(rect);
item->setPen(pen);
item->setBrush(brush);
item->moveBy(rect.x(), rect.y());
addItem(item);
return item;
}

QTEGraphicsLineItem *QTEGraphicsScene::addLine(const QLineF &line, const QPen &pen)
{
QTEGraphicsLineItem* item = new QTEGraphicsLineItem;
item->setLine(line);
item->setPen(pen);
item->moveBy(line.x1(), line.y1());

addItem(item);
return item;
}

void QTEGraphicsScene::drawItems(QPainter *painter, int numItems, QGraphicsItem *items[], const QStyleOptionGraphicsItem options[], QWidget *widget)
{
for (int i = 0; i < numItems; ++i) {

QTEGraphicsItem *item = (QTEGraphicsItem*)items[i];
if (item->flags() & QGraphicsItem::ItemClipsToShape) {
//painter->setClipPath(item->shape(), Qt::IntersectClip);
}
item->paint(painter, &options[i], widget);
}

}


Word排版工具

支持添加Table、图片、文本,支持导出pdf、jpg、png、svg,支持预览。

QTEWordExpress

QTEWordExpress.h

#ifndef QTEWORDEXPRESS_H
#define QTEWORDEXPRESS_H

#include <QObject>
#include "hngui-qt.h"
#include "hnprinter.h"
#include "hngraphicsscene.h"

class QTEWordExpress : public QObject
{
Q_OBJECT
public:
explicit QTEWordExpress(QObject *parent = 0);

void addText(const QString& text, QFont m_font = QFont(),
Qt::Alignment align = Qt::AlignHCenter, QPointF point= QPointF(0, 0));
void addSignoffText(const QString& text, QFont m_font = QFont());
void addTable(const QTableView* table, QPointF pos = QPointF(0, 0));

int pageNum() { return pageSceneVector.size(); }
QTEGraphicsScene* getPage(int num);
void exportPdf(const QString &pdf);
void print();

QRectF margin();
void setMargin(qreal left = 0, qreal right = 0,
qreal top = 0, qreal botoom = 0);
void setLineSpacing(qreal mainSpacing = 0);
void setHeaderSize(qreal size = 0);
void setFooterSize(qreal size = 0);

QFont font() { return m_font; }
void setFont(QFont m_font = QFont());
void setHeaderFont(QFont m_font = QFont());
QFont mainFont() { return m_mainFont; }
QFont titleFont() { return m_titleFont; }
QFont title2Font() { return m_title2Font; }
QFont headerFont() { return m_headerFont; }
void setHeaderLine(bool show = false);
void setFooterLine(bool show = false);
void setHeaderText(const QString &text, QFont m_font = QFont(),
Qt::Alignment align = Qt::AlignHCenter);
void setFooterText(const QString& text, QFont m_font = QFont(),
Qt::Alignment align = Qt::AlignHCenter);
/**
* @brief initWordExpress 初始化纸张,第一张空白纸
*/
void initWordExpress();

protected:
virtual void adjustdy(qreal dy0);
virtual void createFrame();
virtual void paintPageHeader();
virtual void paintPageFooter();
signals:

public slots:

private:
//输出
QTEPrinter* pr;
//对页面元素高度不能迅速统计的场景
QVector<QTEGraphicsScene*> pageSceneVector;
QTEGraphicsScene* pageScene;

//页面元素
int logicalDpiX;
int logicalDpiY;
QRectF sceneRect;

qreal xpos, xpos2, ypos, ypos2;
qreal dx, dy;

qreal leftMargin;
qreal rightMargin;
qreal topMargin;
qreal bottomMargin;

qreal mainHeight;
qreal titleHeight;
qreal title2Height;
qreal headerHeight;
qreal mainSpacing;
qreal titleSpacing;
qreal title2Spacing;
qreal headerSpacing;

//页眉
qreal headerSize;
QFont m_headerFont;
QFontMetrics *headerFmt;
QString headerText;
//页脚
qreal footerSize;
QString footerStdText;
QString footerText;
//标题
QFont m_titleFont;
QFontMetrics *titleFmt;
//二号标题
QFont m_title2Font;
QFontMetrics *title2Fmt;
//正文
QFont m_mainFont;
QFontMetrics *mainFmt;
//使用中
QFont m_font;
QFontMetrics *fmt;
};

#endif // QTEWORDEXPRESS_H


QTEWordExpress.cpp

#include "hnwordexpress.h"
#include "QTEDefine.h"

QTEWordExpress::QTEWordExpress(QObject *parent) :
QObject(parent),
fmt(0), mainFmt(0),headerFmt(0),titleFmt(0), title2Fmt(0)
{
//setup printer
pr= new QTEPrinter(QPrinter::HighResolution);
pr->setFullPage(true);
pr->setColorMode(QPrinter::Color);
pr->setPaperSize(QPrinter::A4);
pr->setOrientation(QPrinter::Portrait);
pr->setOutputFormat(QPrinter::PdfFormat);

//Font目标是打印纸上,所见即所得。
//Pos目标不是纸上的,是屏幕上的,所以更换屏幕,必须更换DPI;
//这个数值是迪文屏上的标准分辨率,打印机使用会失真;
//迪文View 142,138 //PCView 96 //打印机View 1200
//打印机分辨率1200不会失真,绘图必须进行坐标变换。
//数值增大,DrawText可用空间减小甚至切掉一部分
#ifdef __MIPS_LINUX__
//这是实验结果,和理论结果不符合。
logicalDpiX = 136;
logicalDpiY = 156;
#else
logicalDpiX = 96;
logicalDpiY = 96;
#endif

QRect rect = pr->paperRect();
sceneRect = QRectF(0.0, 0.0, logicalDpiX *rect.width()/pr->logicalDpiX(), logicalDpiY*rect.height()/pr->logicalDpiY());

#if 0
//1200 9917,14033 printerRect 固定
//116  958,1356 sceneRect
//142  1113,1660 sceneRect
pline() << pr->logicalDpiX() << pr->logicalDpiY();
pline()  << logicalDpiX << logicalDpiY << pr->pageRect() << sceneRect;
pline() << pr->paperRect(QPrinter::DevicePixel);
pline() << pr->paperRect(QPrinter::Millimeter);
pline() << pr->paperRect(QPrinter::Point);
pline() << pr->paperRect(QPrinter::Inch);
pline() << pr->paperRect(QPrinter::Pica);
pline() << pr->paperRect(QPrinter::Didot);
pline() << pr->paperRect(QPrinter::Cicero);
#endif

m_mainFont = QApplication::font();
if(mainFmt)
delete mainFmt;
mainFmt = new QFontMetrics(m_mainFont);
m_titleFont= QApplication::font();
m_titleFont.setPointSize(22);
if(titleFmt)
delete titleFmt;
titleFmt = new QFontMetrics(m_titleFont);
m_title2Font = QApplication::font();;
m_title2Font.setPointSize(16);
if(title2Fmt)
delete title2Fmt;
title2Fmt =new QFontMetrics(m_title2Font);

setMargin();
setHeaderSize();
setFooterSize();

setFont();
setHeaderFont();
setLineSpacing();

setHeaderLine();
setFooterLine();

initWordExpress();
}

void QTEWordExpress::setMargin(qreal left, qreal right, qreal top, qreal botoom)
{
leftMargin=134.6;
rightMargin=134.6;
topMargin=177.7;
bottomMargin=177.7;
}

QRectF QTEWordExpress::margin()
{
return QRectF(leftMargin, topMargin,
sceneRect.width()-leftMargin-rightMargin,
sceneRect.height()-topMargin-bottomMargin);
}

void QTEWordExpress::setFont(QFont font)
{
//normal font 11
m_font = QApplication::font();
if(fmt)
delete fmt;
fmt = new QFontMetrics(m_font);
}

void QTEWordExpress::setLineSpacing(qreal spacing)
{
//单倍行距
mainHeight = mainFmt->height();
titleHeight = titleFmt->height();
title2Height = title2Fmt->height();
headerHeight = headerFmt->height();

mainSpacing = mainFmt->height() * 2;
titleSpacing = titleFmt->height() * 2;
title2Spacing = title2Fmt->height() * 2;
headerSpacing = headerFmt->height() * 1;
}

void QTEWordExpress::addText(const QString &text, QFont font, Qt::Alignment align, QPointF point)
{
QFontMetrics fmt = QFontMetrics(font);
int spacing = fmt.height() * 2;
int height = fmt.height();
int width=fmt.width(text);

pline() << font.pointSize() << fmt.height();

adjustdy(height + spacing);

QTEGraphicsTextItem* item = pageScene->addText(text, font);

if(align & Qt::AlignLeft)
item->moveBy(dx, dy+height);
else if(align & Qt::AlignRight)
item->moveBy(xpos2 - width, dy+height);
else if(align & Qt::AlignHCenter)
item->moveBy((pageScene->width()/2)-(width/2), dy+height);
dy += height + spacing;
}

void QTEWordExpress::addSignoffText(const QString &text, QFont font)
{
adjustdy(mainHeight + mainSpacing);

int ddy = dy;

dy = ypos2 - ( (mainHeight + mainSpacing) * 2 );

addText(text, m_mainFont, Qt::AlignRight);

dy = ddy;
}

void QTEWordExpress::addTable(const QTableView *table, QPointF pos)
{
const QTableView *tableView = table;
QAbstractItemModel* model = tableView->model();
QFont tableFont = tableView->font();
QFontMetrics tableFmt = QFontMetrics(tableFont);

int tableRowHeight = tableView->horizontalHeader()->height();
adjustdy(tableRowHeight);
for (int i=0; i<model->columnCount(); i++) {
int logicalIndex=tableView->horizontalHeader()->logicalIndex(i);
int actColSize= tableView->columnWidth(logicalIndex);

QPen pen(Qt::gray, 0.1);
QBrush brush(QColor(255, 250, 250));
//QBrush brush(tableView->horizontalHeader()->palette().background());
pageScene->addRect(dx,dy, actColSize,tableRowHeight, pen, brush);

QString txt = model->headerData(logicalIndex,Qt::Horizontal,Qt::DisplayRole).toString();
txt = tableFmt.elidedText(txt, Qt::ElideRight, actColSize-2);
QTEGraphicsTextItem *item = pageScene->addText(txt, tableFont);
item->moveBy(dx, dy);
dx += actColSize;
}
dy += tableRowHeight;

//Table rows
QPen pen(Qt::gray, 0.1);
QBrush brush(Qt::gray, Qt::SolidPattern);
int row = 0;
for (;;) {
if (row >= model->rowCount()) {
break;
}

tableRowHeight = tableView->rowHeight(row);
adjustdy(tableRowHeight);
for (int j=0; j<model->columnCount(); j++) {
int logicalIndex=tableView->horizontalHeader()->logicalIndex(j);
int actColSize=tableView->columnWidth(logicalIndex);

QPen pen(Qt::gray, 0.1);
QBrush brush(tableView->palette().window());
bool balt = tableView->alternatingRowColors();
if(balt)
{
int modulo= row % 2;
if (modulo != 0) {
//rectangle grey
pageScene->addRect(dx,dy,actColSize,tableRowHeight, pen, brush);
}
else
{
pageScene->addRect(dx,dy,actColSize,tableRowHeight, pen);
}
}
else
{
pageScene->addRect(dx,dy,actColSize,tableRowHeight, pen);
}

QString txt = model->data(model->index(row,logicalIndex)).toString();
txt=tableFmt.elidedText(txt,Qt::ElideRight,actColSize-2);
QTEGraphicsTextItem *item = pageScene->addText(txt, tableFont);
item->moveBy(dx,dy);

dx+=actColSize;
}
row++;
dy += tableRowHeight;
dx = xpos;
}
}

void QTEWordExpress::exportPdf(const QString &pdf)
{
// setup printer
pr->setOutputFileName(pdf);

// print pdf
QPainter p(pr);

QTEGraphicsScene* pageScene = 0;
foreach (pageScene, pageSceneVector) {

pageScene->render(&p, pr->paperRect(), sceneRect);

if(pageScene != pageSceneVector.last())
pr->newPage();
}
}

QTEGraphicsScene *QTEWordExpress::getPage(int num)
{
if(num < 1 || num > pageSceneVector.size())
return NULL;
return pageSceneVector.at(num-1);
}

void QTEWordExpress::print()
{
pr->print();
}

void QTEWordExpress::setHeaderFont(QFont font)
{
//header font
m_headerFont = QApplication::font();;
m_headerFont.setPointSize(9);
if(headerFmt)
delete headerFmt;
headerFmt =new QFontMetrics(m_headerFont);
}

void QTEWordExpress::setHeaderSize(qreal size)
{
headerSize=70;
}

void QTEWordExpress::setHeaderLine(bool show)
{

}

void QTEWordExpress::setHeaderText(const QString &text, QFont font, Qt::Alignment align)
{
headerText = text;
paintPageHeader();
}

void QTEWordExpress::setFooterSize(qreal size)
{
footerSize=70;
}

void QTEWordExpress::setFooterLine(bool show)
{

}

void QTEWordExpress::setFooterText(const QString &text, QFont font, Qt::Alignment align)
{
footerText = text;
paintPageFooter();
}

void QTEWordExpress::initWordExpress()
{
while ( ! pageSceneVector.isEmpty() ) {
QTEGraphicsScene* pageScene = pageSceneVector.first();
pageScene->clear();
delete pageScene;
pageSceneVector.remove(0);
}
headerText = "";
footerText = "";
createFrame();
}

void QTEWordExpress::adjustdy(qreal dy0)
{
dx = xpos;
if(dy + dy0 < ypos2)
return;
createFrame();
}

void QTEWordExpress::createFrame()
{
xpos = leftMargin;
xpos2 = sceneRect.width() - rightMargin;
ypos = topMargin;
ypos2 = sceneRect.height() - bottomMargin;
dx = xpos;
dy = ypos;

pageScene = new QTEGraphicsScene(sceneRect);
pageSceneVector.append(pageScene);
paintPageHeader();
paintPageFooter();
}

void QTEWordExpress::paintPageHeader()
{
// Page header
if (headerText.isEmpty())
return;

int sx = xpos;
int sy = ypos-headerSize;
//页眉
QTEGraphicsTextItem *headerItem = pageScene->addText(headerText, m_headerFont);
headerItem->moveBy(sx, sy);

//std text
QString date=QDate::currentDate().toString(QLocale().dateFormat());
QString time=QTime::currentTime().toString(QLocale().timeFormat(QLocale::ShortFormat));
QString headerStdText;
headerStdText = date+"  "+time;
QTEGraphicsTextItem *item = pageScene->addText(headerStdText, m_headerFont);
item->moveBy(xpos2 - headerFmt->width(headerStdText), sy);

sy += headerItem->boundingRect().height();

//line
pageScene->addLine(xpos, sy, xpos2, sy, QPen(Qt::black, 1.0));
}

void QTEWordExpress::paintPageFooter()
{
if (footerText.isEmpty())
return;

// footer
int sx = xpos;

QString footerStdText = tr("第 ") + QString::number(pageSceneVector.size()) + tr(" 页");
QTEGraphicsTextItem *item=pageScene->addText(footerStdText, m_headerFont);
int height = item->boundingRect().height();
int sy = ypos2 + footerSize - height;
item->moveBy(xpos2 - headerFmt->width(footerStdText), sy);

pageScene->addLine(xpos, sy, xpos2, sy, QPen(Qt::black, 1.0));

QTEGraphicsTextItem *footerItem=pageScene->addText(footerText, m_headerFont);
footerItem->moveBy(xpos, sy);
}


QTEReport

QTEReport.h

#ifndef QTEREPORT_H
#define QTEREPORT_H

#include "hnwordexpress.h"

class QTEReport : public QTEWordExpress
{
Q_OBJECT
public:
explicit QTEReport(QObject *parent = 0);

void createSampleReport(const QString& head, const QString& foot, const QString& title,
const QTableView* table);
void GenerateComplexReport();
signals:

public slots:

// QTEWordExpress interface
protected:

private:
};

QTEReport* QTEReportInstance(QObject* parent);

#endif // QTEREPORT_H


QTEReport.cpp

#include "hnreport.h"

QTEReport::QTEReport(QObject *parent) :
QTEWordExpress(parent)
{
}

void QTEReport::createSampleReport(const QString &head, const QString &foot, const QString &title, const QTableView *table)
{
initWordExpress();
setHeaderText(head);
setFooterText(foot);
addText(title, titleFont());
addText("试验结果", title2Font(), Qt::AlignLeft);
addTable(table);
addSignoffText("打印人:___________");
}

void QTEReport::GenerateComplexReport()
{
}

QTEReport *QTEReportInstance(QObject *parent)
{
static QTEReport* r = new QTEReport(parent);
return r;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  qt linux pdf QGraphics