本篇的目的是编写一个工具,能够方便的对富文本、表格、图片生成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->rect.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,