47void PageItem::
paint(QPainter *painter,
const QStyleOptionGraphicsItem *option, QWidget *widget)
54 painter->setPen(QPen(Qt::red, 0));
55 painter->setBrush(Qt::NoBrush);
56 painter->drawRect(QRectF(-border()+1.0, -border()+1.0, boundingRect().width()-2, boundingRect().height()-2));
60 QRectF paperRect(0,0, paperSize.width(), paperSize.height());
63 painter->setClipRect(option->exposedRect);
64 qreal shWidth = paperRect.width()/100;
65 QRectF rshadow(paperRect.topRight() + QPointF(0, shWidth),
66 paperRect.bottomRight() + QPointF(shWidth, 0));
67 QLinearGradient rgrad(rshadow.topLeft(), rshadow.topRight());
68 rgrad.setColorAt(0.0, QColor(0,0,0,255));
69 rgrad.setColorAt(1.0, QColor(0,0,0,0));
70 painter->fillRect(rshadow, QBrush(rgrad));
71 QRectF bshadow(paperRect.bottomLeft() + QPointF(shWidth, 0),
72 paperRect.bottomRight() + QPointF(0, shWidth));
73 QLinearGradient bgrad(bshadow.topLeft(), bshadow.bottomLeft());
74 bgrad.setColorAt(0.0, QColor(0,0,0,255));
75 bgrad.setColorAt(1.0, QColor(0,0,0,0));
76 painter->fillRect(bshadow, QBrush(bgrad));
77 QRectF cshadow(paperRect.bottomRight(),
78 paperRect.bottomRight() + QPointF(shWidth, shWidth));
79 QRadialGradient cgrad(cshadow.topLeft(), shWidth, cshadow.topLeft());
80 cgrad.setColorAt(0.0, QColor(0,0,0,255));
81 cgrad.setColorAt(1.0, QColor(0,0,0,0));
82 painter->fillRect(cshadow, QBrush(cgrad));
84 painter->setClipRect(paperRect & option->exposedRect);
85 painter->fillRect(paperRect, Qt::white);
88 painter->drawPicture(pageRect.topLeft(), *pagePicture);
92 path.addRect(paperRect);
93 path.addRect(pageRect);
94 painter->setPen(QPen(Qt::NoPen));
95 painter->setBrush(QColor(255, 255, 255, 180));
96 painter->drawPath(path);
100 painter->setPen(QPen(Qt::black, 0));
101 painter->setBrush(Qt::NoBrush);
102 painter->drawRect(paperRect);
186 Q_Q(QPrintPreviewWidget);
188 if (curPage < 1 || curPage > pages.size())
196 if (zoomMode == QPrintPreviewWidget::FitInView) {
197 const QList<QGraphicsItem*> containedItems = graphicsView->items(viewRect, Qt::ContainsItemBoundingRect);
198 for (QGraphicsItem* item : containedItems) {
199 PageItem* pg =
static_cast<PageItem*>(item);
200 if (pg->pageNumber() == curPage)
210 QRectF target = pages.at(curPage-1)->sceneBoundingRect();
211 if (viewMode == QPrintPreviewWidget::FacingPagesView) {
214 target.setLeft(target.left() - target.width());
216 target.setRight(target.right() + target.width());
217 }
else if (viewMode == QPrintPreviewWidget::AllPagesView) {
218 target = scene->itemsBoundingRect();
221 if (zoomMode == QPrintPreviewWidget::FitToWidth) {
223 qreal scale =
graphicsView->viewport()->width() / target.width();
224 t.scale(scale, scale);
228 viewSceneRect.moveTop(target.top());
232 graphicsView->fitInView(target, Qt::KeepAspectRatio);
233 if (zoomMode == QPrintPreviewWidget::FitInView) {
234 const int step = qRound(
graphicsView->transform().mapRect(target).height());
240 zoomFactor = graphicsView->transform().m11() * (
float(printer->logicalDpiY()) / q->logicalDpiY());
241 emit q->previewChanged();
280 Q_Q(QPrintPreviewWidget);
284 graphicsView->setDragMode(QGraphicsView::ScrollHandDrag);
285 graphicsView->setViewportUpdateMode(QGraphicsView::SmartViewportUpdate);
286 QObject::connect(graphicsView->verticalScrollBar(), SIGNAL(valueChanged(
int)),
287 q, SLOT(_q_updateCurrentPage()));
288 QObject::connect(graphicsView, SIGNAL(resized()), q, SLOT(_q_fit()));
290 scene =
new QGraphicsScene(graphicsView);
291 scene->setBackgroundBrush(Qt::gray);
292 graphicsView->setScene(scene);
294 QVBoxLayout *layout =
new QVBoxLayout(q);
295 layout->setContentsMargins(0, 0, 0, 0);
320 int numPages = pages.size();
324 int numPagePlaces = numPages;
326 if (viewMode == QPrintPreviewWidget::AllPagesView) {
327 if (printer->pageLayout().orientation() == QPageLayout::Portrait)
328 cols = qCeil(qSqrt((
float) numPages));
330 cols = qFloor(qSqrt((
float) numPages));
333 else if (viewMode == QPrintPreviewWidget::FacingPagesView) {
337 int rows = qCeil(qreal(numPagePlaces) / cols);
339 qreal itemWidth = pages.at(0)->boundingRect().width();
340 qreal itemHeight = pages.at(0)->boundingRect().height();
342 for (
int i = 0; i < rows && pageNum <= numPages; i++) {
343 for (
int j = 0; j < cols && pageNum <= numPages; j++) {
344 if (!i && !j && viewMode == QPrintPreviewWidget::FacingPagesView) {
348 pages.at(pageNum-1)->setPos(QPointF(j*itemWidth, i*itemHeight));
353 scene->setSceneRect(scene->itemsBoundingRect());
QRectF boundingRect() const override
This pure virtual function defines the outer bounds of the item as a rectangle; all painting must be ...
void paint(QPainter *painter, const QStyleOptionGraphicsItem *item, QWidget *widget) override
This function, which is usually called by QGraphicsView, paints the contents of an item in local coor...
PageItem(int _pageNum, const QPicture *_pagePicture, QSize _paperSize, QRect _pageRect)