最近写了一个小项目 中间要把所获取的数据以报告的形式打印出来 在这里整理出来
首先是背景的显示 也就是相当于那张纸张 这里面要对它设置大小 并且我自己加了一个水印在这个纸上 后面会调用这个类进行把报表的其他内容绘制上去
singlereporframet.h
#ifndef SINGLEREPORFRAMET_H
#define SINGLEREPORFRAMET_H
#include <QPushButton>
#include <QPainter>
#include <QPixmap>
#include <QPicture>
class singlereporframet : public QPushButton
{
//Q_OBJECT
public:
singlereporframet(QWidget *parent = 0);
~singlereporframet();
public:
QPixmap *m_report;
QPicture *m_reportPicture;
private:
void paintEvent(QPaintEvent *);
void drawReport(QPicture *report);
};
#endif // SINGLEREPORFRAMET_H
singlereporframet.cpp
void singlereporframet::paintEvent(QPaintEvent *e)
{
drawReport(m_reportPicture);
}
void singlereporframet::drawReport(QPicture *report)
{
if (report == NULL)
{
return;
}
QPainter painter;
painter.begin(this);
QRect rect = painter.viewport();
QSize size;
size.setWidth(595);
size.setHeight(839);
painter.setViewport(rect.x(), rect.y(), size.width(), size.height());
painter.setWindow(QRect(0, 0, 595, 839));
painter.setPen(QPen(Qt::white, 1, Qt::SolidLine, Qt::RoundCap));
painter.setBrush(QBrush(Qt::white, Qt::SolidPattern));
painter.drawRect(10, 10, 595, 839);
painter.drawPicture(10, 10, *report);
QPixmap ground;
ground.load("background.jpg"); //水印
QPixmap tempp(ground.size());
tempp.fill(Qt::transparent);
QPainter p(&tempp);
p.setCompositionMode(QPainter::CompositionMode_Source);
p.drawPixmap(0, 0, ground);
p.setCompositionMode(QPainter::CompositionMode_DestinationIn);
p.fillRect(tempp.rect(), QColor(0, 0, 0, 35));
painter.drawPixmap(130, 300,tempp);
painter.end();
}
后面是对报告上的具体内容进行实现 主要是分开各个小的模块进行绘制 然后把它们最后拼装到那张A4纸上
reportinterface.cpp
void reportinterface::GenerateReportForPeriod(QList<QPicture *> &listreport)
{
QPicture *report = new QPicture;
int topline = 20;
int line = 2;
QPainter painter;
painter.begin(report);
QRect range;
QString text;
range = QRect(430, topline, 120, 17);
painter.setPen(QPen(QColor(qRgb(255,255,255)), 1, Qt::SolidLine, Qt::RoundCap));
painter.drawRect(range);
painter.setPen(QPen(Qt::black, 1, Qt::SolidLine, Qt::RoundCap));
text = QString::fromLocal8Bit("第___页,共___页");
painter.setFont(QFont("Times New Roman", 10));
painter.drawText(range, Qt::AlignRight, text);
topline = topline +19;
range = QRect(350, topline, 200, 17);
painter.setPen(QPen(QColor(qRgb(255, 255, 255)), 1, Qt::SolidLine, Qt::RoundCap));
// painter.setBrush(QBrush(QColor(qRgb(118, 154, 207)), Qt::SolidPattern));
painter.drawRect(range);
painter.setPen(QPen(Qt::black, 1, Qt::SolidLine, Qt::RoundCap));
text = QString::fromLocal8Bit("fff(2015)检字B 第____号");
painter.setFont(QFont("Times New Roman", 10));
painter.drawText(range, Qt::AlignRight, text);
topline = topline + 23;
range = QRect(200, topline, 250, 27);
painter.setPen(QPen(QColor(qRgb(255, 255, 255)), 1, Qt::SolidLine, Qt::RoundCap));
painter.drawRect(range);
painter.setPen(QPen(Qt::black, 1, Qt::SolidLine, Qt::RoundCap));
text = QString::fromLocal8Bit("检 测 报 告 单");
painter.setFont(QFont("Times New Roman", 20, QFont::Bold));
painter.drawText(range, Qt::AlignLeft, text);
topline = topline + 40;
painter.setPen(QPen(Qt::black, 2));
painter.drawLine(45, topline, 550, topline);
topline = topline +20 ;
range = QRect(45, topline, 60, 17);
painter.setPen(QPen(QColor(qRgb(255, 255, 255)), 1, Qt::SolidLine, Qt::RoundCap));
painter.drawRect(range);
painter.setPen(QPen(Qt::black, 1, Qt::SolidLine, Qt::RoundCap));
text = QString::fromLocal8Bit("样品名称");
painter.setFont(QFont("Times New Roman", 10, QFont::Bold));
painter.drawText(range, Qt::AlignLeft, text);
painter.setPen(QPen(Qt::black, 1));
painter.drawLine(45 + 60 + line, topline+18, 297, topline+18);
range = QRect(45+60 + line, topline, 190, 17);
painter.setPen(QPen(QColor(qRgb(255, 255, 255)), 1, Qt::SolidLine, Qt::RoundCap));
painter.drawRect(range);
painter.setPen(QPen(Qt::black, 1, Qt::SolidLine, Qt::RoundCap));
text = QString::fromLocal8Bit("一二三四五六七八");
painter.setFont(QFont("Times New Roman", 9));
painter.drawText(range, Qt::AlignLeft, text);
range = QRect(45+60+190+line*2, topline, 60, 17);
painter.setPen(QPen(QColor(qRgb(255, 255, 255)), 1, Qt::SolidLine, Qt::RoundCap));
painter.drawRect(range);
painter.setPen(QPen(Qt::black, 1, Qt::SolidLine, Qt::RoundCap));
text = QString::fromLocal8Bit("样品型号");
painter.setFont(QFont("Times New Roman", 10, QFont::Bold));
painter.drawText(range, Qt::AlignLeft, text);
painter.setPen(QPen(Qt::black, 1));
painter.drawLine(45+60*2+190+line*3, topline + 18, 550, topline + 18);
range = QRect(45 + 60*2+190 + line*3, topline, 190, 17);
painter.setPen(QPen(QColor(qRgb(255, 255, 255)), 1, Qt::SolidLine, Qt::RoundCap));
painter.drawRect(range);
painter.setPen(QPen(Qt::black, 1, Qt::SolidLine, Qt::RoundCap));
text = QString::fromLocal8Bit("一二三四五六七八");
painter.setFont(QFont("Times New Roman", 9));
painter.drawText(range, Qt::AlignLeft, text);
topline = topline + 25;
<span style="white-space:pre"> </span>painter.end();
<span style="white-space:pre"> </span>listreport.append(report);
最后就只要在主函数中调用这些 并把它们显示出来就好了
GenerateReportForPeriod(m_listPeriodReport);
foreach(QPicture *m_report, m_listPeriodReport)
{
singlereporframet *pbtnReport = new singlereporframet(scrollAreaStackedwidget);
pbtnReport->m_reportPicture = m_report;
scrollAreaStackedwidget->addWidget(pbtnReport);
}