HM-SPMS/product/src/gui/plugin/DevHisDataWidget/CTableViewPrinter.cpp
2025-03-17 14:25:29 +08:00

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();
}