129 lines
5.8 KiB
C++
129 lines
5.8 KiB
C++
#include "CTableViewPrinter.h"
|
|
#include <QPainter>
|
|
#include <QPrinter>
|
|
#include <QTableView>
|
|
#include <QHeaderView>
|
|
#include <QAbstractItemModel>
|
|
|
|
CTableViewPrinter::CTableViewPrinter(QTableView *view)
|
|
: m_pView(view)
|
|
{
|
|
m_pModel = view->model();
|
|
}
|
|
|
|
bool CTableViewPrinter::print(QPrinter * printer)
|
|
{
|
|
QHeaderView * horizontalHeader = m_pView->horizontalHeader();
|
|
QHeaderView * verticalHeader = m_pView->verticalHeader();
|
|
|
|
qreal marginHorizontal = 20;
|
|
qreal marginVertical = 20;
|
|
|
|
QRectF pageRect = printer->pageRect().adjusted(0, 0, -marginHorizontal * 2, -marginVertical * 2);
|
|
printer->setPageMargins(QMarginsF(marginHorizontal,marginVertical,marginHorizontal,marginVertical));
|
|
|
|
int length = 0;
|
|
horizontalHeader->resize(pageRect.width(), horizontalHeader->height());
|
|
for(int nSection(3); nSection < horizontalHeader->count(); nSection++)
|
|
{
|
|
length += horizontalHeader->sectionSize(nSection);
|
|
}
|
|
horizontalHeader->resizeSection(0, (horizontalHeader->width() - length)/3);
|
|
horizontalHeader->resizeSection(1, (horizontalHeader->width() - length)/3);
|
|
horizontalHeader->resizeSection(2, (horizontalHeader->width() - length)/3);
|
|
|
|
QPainter painter(printer);
|
|
if(!painter.isActive())
|
|
{
|
|
return false;
|
|
}
|
|
|
|
renderHeader(painter);
|
|
|
|
int offset = 0;
|
|
int currentPage = 0;
|
|
int horizontalHeaderHeight = horizontalHeader->height();
|
|
for(int row(0); row < m_pModel->rowCount(); row++)
|
|
{
|
|
if(row > 0 && verticalHeader->sectionPosition(row - 1) + horizontalHeaderHeight < pageRect.height() && verticalHeader->sectionPosition(row) > pageRect.height())
|
|
{
|
|
horizontalHeaderHeight = 0;
|
|
}
|
|
|
|
if((int)(((verticalHeader->sectionPosition(row) + horizontalHeaderHeight) / pageRect.height())) != currentPage)
|
|
{
|
|
printer->newPage();
|
|
currentPage++;
|
|
offset = verticalHeader->sectionPosition(row) + horizontalHeaderHeight;
|
|
drawGridLine(&painter, QPoint(verticalHeader->width(), 0.5), QPoint(horizontalHeader->width() + verticalHeader->width(), 0.5));
|
|
}
|
|
|
|
for(int column(0); column < m_pModel->columnCount(); column++)
|
|
{
|
|
int rowPosition = (verticalHeader->sectionPosition(row) + horizontalHeaderHeight) - offset;
|
|
int columnPosition = horizontalHeader->sectionPosition(column) + verticalHeader->width();
|
|
int rowHeight = m_pView->rowHeight(row);
|
|
int columnWidth = m_pView->columnWidth(column);
|
|
|
|
//< draw item
|
|
QStyleOptionViewItem opt;
|
|
opt.rect = QRect(columnPosition, rowPosition, columnWidth, rowHeight);
|
|
painter.save();
|
|
painter.drawText(opt.rect, Qt::AlignCenter, m_pModel->data(m_pModel->index(row, column)).toString());
|
|
painter.restore();
|
|
|
|
//< Vertical Line
|
|
if(column == 0)
|
|
{
|
|
QPoint top(columnPosition, verticalHeader->sectionPosition(row) - offset + horizontalHeaderHeight);
|
|
QPoint bottom(columnPosition, verticalHeader->sectionPosition(row) + verticalHeader->sectionSize(row) - offset + horizontalHeaderHeight);
|
|
drawGridLine(&painter, top, bottom);
|
|
}
|
|
QPoint top(columnPosition + horizontalHeader->sectionSize(column), verticalHeader->sectionPosition(row) - offset + horizontalHeaderHeight);
|
|
QPoint bottom(columnPosition + horizontalHeader->sectionSize(column), verticalHeader->sectionPosition(row) + verticalHeader->sectionSize(row) - offset + horizontalHeaderHeight);
|
|
drawGridLine(&painter, top, bottom);
|
|
}
|
|
//< Horizontal Line
|
|
int rowPosition = verticalHeader->sectionPosition(row) + verticalHeader->sectionSize(row) + horizontalHeaderHeight - offset;
|
|
QPoint left(verticalHeader->width(), rowPosition);
|
|
QPoint right(verticalHeader->width() + horizontalHeader->sectionPosition(m_pModel->columnCount() - 1) + horizontalHeader->sectionSize(m_pModel->columnCount() - 1), rowPosition);
|
|
drawGridLine(&painter, left, right);
|
|
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void CTableViewPrinter::renderHeader(QPainter &painter)
|
|
{
|
|
QHeaderView * horizontalHeader = m_pView->horizontalHeader();
|
|
QHeaderView * verticalHeader = m_pView->verticalHeader();
|
|
for(int column(0); column < horizontalHeader->count(); column++)
|
|
{
|
|
painter.save();
|
|
int columnPosition = horizontalHeader->sectionPosition(column) + verticalHeader->width();
|
|
QPoint top(columnPosition, 0);
|
|
QPoint bottom(columnPosition, horizontalHeader->height());
|
|
drawGridLine(&painter, top, bottom);
|
|
QRect rect = QRect(columnPosition, 0, horizontalHeader->sectionSize(column) , horizontalHeader->height());
|
|
painter.drawText(rect, m_pModel->headerData(column, Qt::Horizontal).toString(), QTextOption(Qt::AlignCenter));
|
|
painter.restore();
|
|
}
|
|
int columnPosition = horizontalHeader->width() + verticalHeader->width();
|
|
QPoint top(columnPosition, 0);
|
|
QPoint bottom(columnPosition, horizontalHeader->height());
|
|
drawGridLine(&painter, top, bottom);
|
|
drawGridLine(&painter, QPoint(verticalHeader->width(), 0.5), QPoint(horizontalHeader->width() + verticalHeader->width(), 0.5));
|
|
drawGridLine(&painter, QPoint(verticalHeader->width(), 0.5 + horizontalHeader->height()), QPoint(horizontalHeader->width() + verticalHeader->width(), 0.5 + horizontalHeader->height()));
|
|
}
|
|
|
|
void CTableViewPrinter::drawGridLine(QPainter *painter, const QPointF &p1, const QPointF &p2)
|
|
{
|
|
painter->save();
|
|
QStyleOptionViewItem opt;
|
|
const int gridHint = m_pView->style()->styleHint(QStyle::SH_Table_GridLineColor, &opt, m_pView);
|
|
const QColor gridColor = static_cast<QRgb>(gridHint);
|
|
painter->setPen(gridColor);
|
|
painter->drawLine(p1, p2);
|
|
painter->restore();
|
|
}
|