#include "CTableViewPrinter.h" #include #include #include #include #include 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(gridHint); painter->setPen(gridColor); painter->drawLine(p1, p2); painter->restore(); }