source: trunk/src/gui/widgets/qprintpreviewwidget.cpp@ 846

Last change on this file since 846 was 846, checked in by Dmitry A. Kuminov, 14 years ago

trunk: Merged in qt 4.7.2 sources from branches/vendor/nokia/qt.

File size: 24.2 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation (qt-info@nokia.com)
6**
7** This file is part of the QtGui module of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
15**
16** GNU Lesser General Public License Usage
17** Alternatively, this file may be used under the terms of the GNU Lesser
18** General Public License version 2.1 as published by the Free Software
19** Foundation and appearing in the file LICENSE.LGPL included in the
20** packaging of this file. Please review the following information to
21** ensure the GNU Lesser General Public License version 2.1 requirements
22** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23**
24** In addition, as a special exception, Nokia gives you certain additional
25** rights. These rights are described in the Nokia Qt LGPL Exception
26** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you have questions regarding the use of this file, please contact
37** Nokia at qt-info@nokia.com.
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#include "qprintpreviewwidget.h"
43#include "private/qwidget_p.h"
44#include <private/qprinter_p.h>
45
46#include <QtCore/qmath.h>
47#include <QtGui/qboxlayout.h>
48#include <QtGui/qgraphicsitem.h>
49#include <QtGui/qgraphicsview.h>
50#include <QtGui/qscrollbar.h>
51#include <QtGui/qstyleoption.h>
52
53#ifndef QT_NO_PRINTPREVIEWWIDGET
54
55QT_BEGIN_NAMESPACE
56
57namespace {
58class PageItem : public QGraphicsItem
59{
60public:
61 PageItem(int _pageNum, const QPicture* _pagePicture, QSize _paperSize, QRect _pageRect)
62 : pageNum(_pageNum), pagePicture(_pagePicture),
63 paperSize(_paperSize), pageRect(_pageRect)
64 {
65 qreal border = qMax(paperSize.height(), paperSize.width()) / 25;
66 brect = QRectF(QPointF(-border, -border),
67 QSizeF(paperSize)+QSizeF(2*border, 2*border));
68 setCacheMode(DeviceCoordinateCache);
69 }
70
71 inline QRectF boundingRect() const
72 { return brect; }
73
74 inline int pageNumber() const
75 { return pageNum; }
76
77 void paint(QPainter *painter, const QStyleOptionGraphicsItem *item, QWidget *widget);
78
79private:
80 int pageNum;
81 const QPicture* pagePicture;
82 QSize paperSize;
83 QRect pageRect;
84 QRectF brect;
85};
86
87void PageItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
88{
89 Q_UNUSED(widget);
90
91#if 0
92 // Draw item bounding rect, for debugging
93 painter->save();
94 painter->setPen(QPen(Qt::red, 0));
95 painter->setBrush(Qt::NoBrush);
96 painter->drawRect(QRectF(-border()+1.0, -border()+1.0, boundingRect().width()-2, boundingRect().height()-2));
97 painter->restore();
98#endif
99
100 QRectF paperRect(0,0, paperSize.width(), paperSize.height());
101
102 // Draw shadow
103 painter->setClipRect(option->exposedRect);
104 qreal shWidth = paperRect.width()/100;
105 QRectF rshadow(paperRect.topRight() + QPointF(0, shWidth),
106 paperRect.bottomRight() + QPointF(shWidth, 0));
107 QLinearGradient rgrad(rshadow.topLeft(), rshadow.topRight());
108 rgrad.setColorAt(0.0, QColor(0,0,0,255));
109 rgrad.setColorAt(1.0, QColor(0,0,0,0));
110 painter->fillRect(rshadow, QBrush(rgrad));
111 QRectF bshadow(paperRect.bottomLeft() + QPointF(shWidth, 0),
112 paperRect.bottomRight() + QPointF(0, shWidth));
113 QLinearGradient bgrad(bshadow.topLeft(), bshadow.bottomLeft());
114 bgrad.setColorAt(0.0, QColor(0,0,0,255));
115 bgrad.setColorAt(1.0, QColor(0,0,0,0));
116 painter->fillRect(bshadow, QBrush(bgrad));
117 QRectF cshadow(paperRect.bottomRight(),
118 paperRect.bottomRight() + QPointF(shWidth, shWidth));
119 QRadialGradient cgrad(cshadow.topLeft(), shWidth, cshadow.topLeft());
120 cgrad.setColorAt(0.0, QColor(0,0,0,255));
121 cgrad.setColorAt(1.0, QColor(0,0,0,0));
122 painter->fillRect(cshadow, QBrush(cgrad));
123
124 painter->setClipRect(paperRect & option->exposedRect);
125 painter->fillRect(paperRect, Qt::white);
126 if (!pagePicture)
127 return;
128 painter->drawPicture(pageRect.topLeft(), *pagePicture);
129
130 // Effect: make anything drawn in the margins look washed out.
131 QPainterPath path;
132 path.addRect(paperRect);
133 path.addRect(pageRect);
134 painter->setPen(QPen(Qt::NoPen));
135 painter->setBrush(QColor(255, 255, 255, 180));
136 painter->drawPath(path);
137
138#if 0
139 // Draw frame around paper.
140 painter->setPen(QPen(Qt::black, 0));
141 painter->setBrush(Qt::NoBrush);
142 painter->drawRect(paperRect);
143#endif
144
145 // todo: drawtext "Page N" below paper
146}
147
148class GraphicsView : public QGraphicsView
149{
150 Q_OBJECT
151public:
152 GraphicsView(QWidget* parent = 0)
153 : QGraphicsView(parent)
154 {
155#ifdef Q_WS_MAC
156 setFrameStyle(QFrame::NoFrame);
157#endif
158 }
159signals:
160 void resized();
161
162protected:
163 void resizeEvent(QResizeEvent* e)
164 {
165 QGraphicsView::resizeEvent(e);
166 emit resized();
167 }
168
169 void showEvent(QShowEvent* e)
170 {
171 QGraphicsView::showEvent(e);
172 emit resized();
173 }
174};
175
176} // anonymous namespace
177
178class QPrintPreviewWidgetPrivate : public QWidgetPrivate
179{
180 Q_DECLARE_PUBLIC(QPrintPreviewWidget)
181public:
182 QPrintPreviewWidgetPrivate()
183 : scene(0), curPage(1),
184 viewMode(QPrintPreviewWidget::SinglePageView),
185 zoomMode(QPrintPreviewWidget::FitInView),
186 zoomFactor(1), initialized(false), fitting(true)
187 {}
188
189 // private slots
190 void _q_fit(bool doFitting = false);
191 void _q_updateCurrentPage();
192
193 void init();
194 void populateScene();
195 void layoutPages();
196 void generatePreview();
197 void setCurrentPage(int pageNumber);
198 void zoom(qreal zoom);
199 void setZoomFactor(qreal zoomFactor);
200 int calcCurrentPage();
201
202 GraphicsView *graphicsView;
203 QGraphicsScene *scene;
204
205 int curPage;
206 QList<const QPicture *> pictures;
207 QList<QGraphicsItem *> pages;
208
209 QPrintPreviewWidget::ViewMode viewMode;
210 QPrintPreviewWidget::ZoomMode zoomMode;
211 qreal zoomFactor;
212 bool ownPrinter;
213 QPrinter* printer;
214 bool initialized;
215 bool fitting;
216};
217
218void QPrintPreviewWidgetPrivate::_q_fit(bool doFitting)
219{
220 Q_Q(QPrintPreviewWidget);
221
222 if (curPage < 1 || curPage > pages.count())
223 return;
224
225 if (!doFitting && !fitting)
226 return;
227
228 if (doFitting && fitting) {
229 QRect viewRect = graphicsView->viewport()->rect();
230 if (zoomMode == QPrintPreviewWidget::FitInView) {
231 QList<QGraphicsItem*> containedItems = graphicsView->items(viewRect, Qt::ContainsItemBoundingRect);
232 foreach(QGraphicsItem* item, containedItems) {
233 PageItem* pg = static_cast<PageItem*>(item);
234 if (pg->pageNumber() == curPage)
235 return;
236 }
237 }
238
239 int newPage = calcCurrentPage();
240 if (newPage != curPage)
241 curPage = newPage;
242 }
243
244 QRectF target = pages.at(curPage-1)->sceneBoundingRect();
245 if (viewMode == QPrintPreviewWidget::FacingPagesView) {
246 // fit two pages
247 if (curPage % 2)
248 target.setLeft(target.left() - target.width());
249 else
250 target.setRight(target.right() + target.width());
251 } else if (viewMode == QPrintPreviewWidget::AllPagesView) {
252 target = scene->itemsBoundingRect();
253 }
254
255 if (zoomMode == QPrintPreviewWidget::FitToWidth) {
256 QTransform t;
257 qreal scale = graphicsView->viewport()->width() / target.width();
258 t.scale(scale, scale);
259 graphicsView->setTransform(t);
260 if (doFitting && fitting) {
261 QRectF viewSceneRect = graphicsView->viewportTransform().mapRect(graphicsView->viewport()->rect());
262 viewSceneRect.moveTop(target.top());
263 graphicsView->ensureVisible(viewSceneRect); // Nah...
264 }
265 } else {
266 graphicsView->fitInView(target, Qt::KeepAspectRatio);
267 if (zoomMode == QPrintPreviewWidget::FitInView) {
268 int step = qRound(graphicsView->matrix().mapRect(target).height());
269 graphicsView->verticalScrollBar()->setSingleStep(step);
270 graphicsView->verticalScrollBar()->setPageStep(step);
271 }
272 }
273
274 zoomFactor = graphicsView->transform().m11() * (float(printer->logicalDpiY()) / q->logicalDpiY());
275 emit q->previewChanged();
276}
277
278void QPrintPreviewWidgetPrivate::_q_updateCurrentPage()
279{
280 Q_Q(QPrintPreviewWidget);
281
282 if (viewMode == QPrintPreviewWidget::AllPagesView)
283 return;
284
285 int newPage = calcCurrentPage();
286 if (newPage != curPage) {
287 curPage = newPage;
288 emit q->previewChanged();
289 }
290}
291
292int QPrintPreviewWidgetPrivate::calcCurrentPage()
293{
294 int maxArea = 0;
295 int newPage = curPage;
296 QRect viewRect = graphicsView->viewport()->rect();
297 QList<QGraphicsItem*> items = graphicsView->items(viewRect);
298 for (int i=0; i<items.size(); ++i) {
299 PageItem* pg = static_cast<PageItem*>(items.at(i));
300 QRect overlap = graphicsView->mapFromScene(pg->sceneBoundingRect()).boundingRect() & viewRect;
301 int area = overlap.width() * overlap.height();
302 if (area > maxArea) {
303 maxArea = area;
304 newPage = pg->pageNumber();
305 } else if (area == maxArea && pg->pageNumber() < newPage) {
306 newPage = pg->pageNumber();
307 }
308 }
309 return newPage;
310}
311
312void QPrintPreviewWidgetPrivate::init()
313{
314 Q_Q(QPrintPreviewWidget);
315
316 graphicsView = new GraphicsView;
317 graphicsView->setInteractive(false);
318 graphicsView->setDragMode(QGraphicsView::ScrollHandDrag);
319 graphicsView->setViewportUpdateMode(QGraphicsView::SmartViewportUpdate);
320 QObject::connect(graphicsView->verticalScrollBar(), SIGNAL(valueChanged(int)),
321 q, SLOT(_q_updateCurrentPage()));
322 QObject::connect(graphicsView, SIGNAL(resized()), q, SLOT(_q_fit()));
323
324 scene = new QGraphicsScene(graphicsView);
325 scene->setBackgroundBrush(Qt::gray);
326 graphicsView->setScene(scene);
327
328 QVBoxLayout *layout = new QVBoxLayout;
329 q->setLayout(layout);
330 layout->setContentsMargins(0, 0, 0, 0);
331 layout->addWidget(graphicsView);
332}
333
334void QPrintPreviewWidgetPrivate::populateScene()
335{
336 // remove old pages
337 for (int i = 0; i < pages.size(); i++)
338 scene->removeItem(pages.at(i));
339 qDeleteAll(pages);
340 pages.clear();
341
342 int numPages = pictures.count();
343 QSize paperSize = printer->paperRect().size();
344 QRect pageRect = printer->pageRect();
345
346 for (int i = 0; i < numPages; i++) {
347 PageItem* item = new PageItem(i+1, pictures.at(i), paperSize, pageRect);
348 scene->addItem(item);
349 pages.append(item);
350 }
351}
352
353void QPrintPreviewWidgetPrivate::layoutPages()
354{
355 int numPages = pages.count();
356 if (numPages < 1)
357 return;
358
359 int numPagePlaces = numPages;
360 int cols = 1; // singleMode and default
361 if (viewMode == QPrintPreviewWidget::AllPagesView) {
362 if (printer->orientation() == QPrinter::Portrait)
363 cols = qCeil(qSqrt((float) numPages));
364 else
365 cols = qFloor(qSqrt((float) numPages));
366 cols += cols % 2; // Nicer with an even number of cols
367 }
368 else if (viewMode == QPrintPreviewWidget::FacingPagesView) {
369 cols = 2;
370 numPagePlaces += 1;
371 }
372 int rows = qCeil(qreal(numPagePlaces) / cols);
373
374 qreal itemWidth = pages.at(0)->boundingRect().width();
375 qreal itemHeight = pages.at(0)->boundingRect().height();
376 int pageNum = 1;
377 for (int i = 0; i < rows && pageNum <= numPages; i++) {
378 for (int j = 0; j < cols && pageNum <= numPages; j++) {
379 if (!i && !j && viewMode == QPrintPreviewWidget::FacingPagesView) {
380 // Front page doesn't have a facing page
381 continue;
382 } else {
383 pages.at(pageNum-1)->setPos(QPointF(j*itemWidth, i*itemHeight));
384 pageNum++;
385 }
386 }
387 }
388 scene->setSceneRect(scene->itemsBoundingRect());
389}
390
391void QPrintPreviewWidgetPrivate::generatePreview()
392{
393 //### If QPrinter::setPreviewMode() becomes public, handle the
394 //### case that we have been constructed with a printer that
395 //### _already_ has been preview-painted to, so we should
396 //### initially just show the pages it already contains, and not
397 //### emit paintRequested() until the user changes some parameter
398
399 Q_Q(QPrintPreviewWidget);
400 printer->d_func()->setPreviewMode(true);
401 emit q->paintRequested(printer);
402 printer->d_func()->setPreviewMode(false);
403 pictures = printer->d_func()->previewPages();
404 populateScene(); // i.e. setPreviewPrintedPictures() e.l.
405 layoutPages();
406 curPage = qBound(1, curPage, pages.count());
407 if (fitting)
408 _q_fit();
409 emit q->previewChanged();
410}
411
412void QPrintPreviewWidgetPrivate::setCurrentPage(int pageNumber)
413{
414 if (pageNumber < 1 || pageNumber > pages.count())
415 return;
416
417 int lastPage = curPage;
418 curPage = pageNumber;
419
420 if (lastPage != curPage && lastPage > 0 && lastPage <= pages.count()) {
421 if (zoomMode != QPrintPreviewWidget::FitInView) {
422 QScrollBar *hsc = graphicsView->horizontalScrollBar();
423 QScrollBar *vsc = graphicsView->verticalScrollBar();
424 QPointF pt = graphicsView->transform().map(pages.at(curPage-1)->pos());
425 vsc->setValue(int(pt.y()) - 10);
426 hsc->setValue(int(pt.x()) - 10);
427 } else {
428 graphicsView->centerOn(pages.at(curPage-1));
429 }
430 }
431}
432
433void QPrintPreviewWidgetPrivate::zoom(qreal zoom)
434{
435 zoomFactor *= zoom;
436 graphicsView->scale(zoom, zoom);
437}
438
439void QPrintPreviewWidgetPrivate::setZoomFactor(qreal _zoomFactor)
440{
441 Q_Q(QPrintPreviewWidget);
442 zoomFactor = _zoomFactor;
443 graphicsView->resetTransform();
444 int dpi_y = q->logicalDpiY();
445 int printer_dpi_y = printer->logicalDpiY();
446 graphicsView->scale(zoomFactor*(dpi_y/float(printer_dpi_y)),
447 zoomFactor*(dpi_y/float(printer_dpi_y)));
448}
449
450///////////////////////////////////////
451
452/*!
453 \class QPrintPreviewWidget
454 \since 4.4
455
456 \brief The QPrintPreviewWidget class provides a widget for
457 previewing page layouts for printer output.
458
459 \ingroup printing
460
461 QPrintPreviewDialog uses a QPrintPreviewWidget internally, and the
462 purpose of QPrintPreviewWidget is to make it possible to embed the
463 preview into other widgets. It also makes it possible to build a different
464 user interface around it than the default one provided with QPrintPreviewDialog.
465
466 Using QPrintPreviewWidget is straightforward:
467
468 \list 1
469 \o Create the QPrintPreviewWidget
470
471 Construct the QPrintPreviewWidget either by passing in an
472 existing QPrinter object, or have QPrintPreviewWidget create a
473 default constructed QPrinter object for you.
474
475 \o Connect the paintRequested() signal to a slot.
476
477 When the widget needs to generate a set of preview pages, a
478 paintRequested() signal will be emitted from the widget. Connect a
479 slot to this signal, and draw onto the QPrinter passed in as a
480 signal parameter. Call QPrinter::newPage(), to start a new
481 page in the preview.
482
483 \endlist
484
485 \sa QPrinter, QPrintDialog, QPageSetupDialog, QPrintPreviewDialog
486*/
487
488
489/*!
490 \enum QPrintPreviewWidget::ViewMode
491
492 This enum is used to describe the view mode of the preview widget.
493
494 \value SinglePageView A mode where single pages in the preview
495 is viewed.
496
497 \value FacingPagesView A mode where the facing pages in the preview
498 is viewed.
499
500 \value AllPagesView A view mode where all the pages in the preview
501 is viewed.
502*/
503
504/*!
505 \enum QPrintPreviewWidget::ZoomMode
506
507 This enum is used to describe zoom mode of the preview widget.
508
509 \value CustomZoom The zoom is set to a custom zoom value.
510
511 \value FitToWidth This mode fits the current page to the width of the view.
512
513 \value FitInView This mode fits the current page inside the view.
514
515*/
516
517/*!
518 Constructs a QPrintPreviewWidget based on \a printer and with \a
519 parent as the parent widget. The widget flags \a flags are passed on
520 to the QWidget constructor.
521
522 \sa QWidget::setWindowFlags()
523*/
524QPrintPreviewWidget::QPrintPreviewWidget(QPrinter *printer, QWidget *parent, Qt::WindowFlags flags)
525 : QWidget(*new QPrintPreviewWidgetPrivate, parent, flags)
526{
527 Q_D(QPrintPreviewWidget);
528 d->printer = printer;
529 d->ownPrinter = false;
530 d->init();
531}
532
533/*!
534 \overload
535
536 This will cause QPrintPreviewWidget to create an internal, default
537 constructed QPrinter object, which will be used to generate the
538 preview.
539*/
540QPrintPreviewWidget::QPrintPreviewWidget(QWidget *parent, Qt::WindowFlags flags)
541 : QWidget(*new QPrintPreviewWidgetPrivate, parent, flags)
542{
543 Q_D(QPrintPreviewWidget);
544 d->printer = new QPrinter;
545 d->ownPrinter = true;
546 d->init();
547}
548
549
550/*!
551 Destroys the QPrintPreviewWidget.
552*/
553QPrintPreviewWidget::~QPrintPreviewWidget()
554{
555 Q_D(QPrintPreviewWidget);
556 if (d->ownPrinter)
557 delete d->printer;
558}
559
560/*!
561 Returns the current view mode. The default view mode is SinglePageView.
562*/
563QPrintPreviewWidget::ViewMode QPrintPreviewWidget::viewMode() const
564{
565 Q_D(const QPrintPreviewWidget);
566 return d->viewMode;
567}
568
569/*!
570 Sets the view mode to \a mode. The default view mode is
571 SinglePageView.
572*/
573void QPrintPreviewWidget::setViewMode(ViewMode mode)
574{
575 Q_D(QPrintPreviewWidget);
576 d->viewMode = mode;
577 d->layoutPages();
578 if (d->viewMode == AllPagesView) {
579 d->graphicsView->fitInView(d->scene->itemsBoundingRect(), Qt::KeepAspectRatio);
580 d->fitting = false;
581 d->zoomMode = QPrintPreviewWidget::CustomZoom;
582 d->zoomFactor = d->graphicsView->transform().m11() * (float(d->printer->logicalDpiY()) / logicalDpiY());
583 emit previewChanged();
584 } else {
585 d->fitting = true;
586 d->_q_fit();
587 }
588}
589
590/*!
591 Returns the current orientation of the preview. This value is
592 obtained from the QPrinter object associated with the preview.
593*/
594QPrinter::Orientation QPrintPreviewWidget::orientation() const
595{
596 Q_D(const QPrintPreviewWidget);
597 return d->printer->orientation();
598}
599
600/*!
601 Sets the current orientation to \a orientation. This value will be
602 set on the QPrinter object associated with the preview.
603*/
604void QPrintPreviewWidget::setOrientation(QPrinter::Orientation orientation)
605{
606 Q_D(QPrintPreviewWidget);
607 d->printer->setOrientation(orientation);
608 d->generatePreview();
609}
610
611/*!
612 Prints the preview to the printer associated with the preview.
613*/
614void QPrintPreviewWidget::print()
615{
616 Q_D(QPrintPreviewWidget);
617 // ### make use of the generated pages
618 emit paintRequested(d->printer);
619}
620
621/*!
622 Zooms the current view in by \a factor. The default value for \a
623 factor is 1.1, which means the view will be scaled up by 10%.
624*/
625void QPrintPreviewWidget::zoomIn(qreal factor)
626{
627 Q_D(QPrintPreviewWidget);
628 d->fitting = false;
629 d->zoomMode = QPrintPreviewWidget::CustomZoom;
630 d->zoom(factor);
631}
632
633/*!
634 Zooms the current view out by \a factor. The default value for \a
635 factor is 1.1, which means the view will be scaled down by 10%.
636*/
637void QPrintPreviewWidget::zoomOut(qreal factor)
638{
639 Q_D(QPrintPreviewWidget);
640 d->fitting = false;
641 d->zoomMode = QPrintPreviewWidget::CustomZoom;
642 d->zoom(1/factor);
643}
644
645/*!
646 Returns the zoom factor of the view.
647*/
648qreal QPrintPreviewWidget::zoomFactor() const
649{
650 Q_D(const QPrintPreviewWidget);
651 return d->zoomFactor;
652}
653
654/*!
655 Sets the zoom factor of the view to \a factor. For example, a
656 value of 1.0 indicates an unscaled view, which is approximately
657 the size the view will have on paper. A value of 0.5 will halve
658 the size of the view, while a value of 2.0 will double the size of
659 the view.
660*/
661void QPrintPreviewWidget::setZoomFactor(qreal factor)
662{
663 Q_D(QPrintPreviewWidget);
664 d->fitting = false;
665 d->zoomMode = QPrintPreviewWidget::CustomZoom;
666 d->setZoomFactor(factor);
667}
668
669/*!
670 \obsolete
671 Returns the number of pages in the preview.
672 \sa pageCount()
673*/
674int QPrintPreviewWidget::numPages() const
675{
676 Q_D(const QPrintPreviewWidget);
677 return d->pages.size();
678}
679
680/*!
681 \since 4.6
682 Returns the number of pages in the preview.
683*/
684int QPrintPreviewWidget::pageCount() const
685{
686 Q_D(const QPrintPreviewWidget);
687 return d->pages.size();
688}
689
690/*!
691 Returns the currently viewed page in the preview.
692*/
693int QPrintPreviewWidget::currentPage() const
694{
695 Q_D(const QPrintPreviewWidget);
696 return d->curPage;
697}
698
699/*!
700 Sets the current page in the preview. This will cause the view to
701 skip to the beginning of \a page.
702*/
703void QPrintPreviewWidget::setCurrentPage(int page)
704{
705 Q_D(QPrintPreviewWidget);
706 d->setCurrentPage(page);
707}
708
709/*!
710 This is a convenience function and is the same as calling \c
711 {setZoomMode(QPrintPreviewWidget::FitToWidth)}.
712*/
713void QPrintPreviewWidget::fitToWidth()
714{
715 setZoomMode(FitToWidth);
716}
717
718/*!
719 This is a convenience function and is the same as calling \c
720 {setZoomMode(QPrintPreviewWidget::FitInView)}.
721*/
722void QPrintPreviewWidget::fitInView()
723{
724 setZoomMode(FitInView);
725}
726
727/*!
728 Sets the zoom mode to \a zoomMode. The default zoom mode is FitInView.
729
730 \sa zoomMode(), viewMode(), setViewMode()
731*/
732void QPrintPreviewWidget::setZoomMode(QPrintPreviewWidget::ZoomMode zoomMode)
733{
734 Q_D(QPrintPreviewWidget);
735 d->zoomMode = zoomMode;
736 if (d->zoomMode == FitInView || d->zoomMode == FitToWidth) {
737 d->fitting = true;
738 d->_q_fit(true);
739 } else {
740 d->fitting = false;
741 }
742}
743
744/*!
745 Returns the current zoom mode.
746
747 \sa setZoomMode(), viewMode(), setViewMode()
748*/
749QPrintPreviewWidget::ZoomMode QPrintPreviewWidget::zoomMode() const
750{
751 Q_D(const QPrintPreviewWidget);
752 return d->zoomMode;
753}
754
755/*!
756 This is a convenience function and is the same as calling \c
757 {setOrientation(QPrinter::Landscape)}.
758*/
759void QPrintPreviewWidget::setLandscapeOrientation()
760{
761 setOrientation(QPrinter::Landscape);
762}
763
764/*!
765 This is a convenience function and is the same as calling \c
766 {setOrientation(QPrinter::Portrait)}.
767*/
768void QPrintPreviewWidget::setPortraitOrientation()
769{
770 setOrientation(QPrinter::Portrait);
771}
772
773/*!
774 This is a convenience function and is the same as calling \c
775 {setViewMode(QPrintPreviewWidget::SinglePageView)}.
776*/
777void QPrintPreviewWidget::setSinglePageViewMode()
778{
779 setViewMode(SinglePageView);
780}
781
782/*!
783 This is a convenience function and is the same as calling \c
784 {setViewMode(QPrintPreviewWidget::FacingPagesView)}.
785*/
786void QPrintPreviewWidget::setFacingPagesViewMode()
787{
788 setViewMode(FacingPagesView);
789}
790
791/*!
792 This is a convenience function and is the same as calling \c
793 {setViewMode(QPrintPreviewWidget::AllPagesView)}.
794*/
795void QPrintPreviewWidget::setAllPagesViewMode()
796{
797 setViewMode(AllPagesView);
798}
799
800
801/*!
802 This function updates the preview, which causes the
803 paintRequested() signal to be emitted.
804*/
805void QPrintPreviewWidget::updatePreview()
806{
807 Q_D(QPrintPreviewWidget);
808 d->initialized = true;
809 d->generatePreview();
810 d->graphicsView->updateGeometry();
811}
812
813/*! \reimp
814*/
815void QPrintPreviewWidget::setVisible(bool visible)
816{
817 Q_D(QPrintPreviewWidget);
818 if (visible && !d->initialized)
819 updatePreview();
820 QWidget::setVisible(visible);
821}
822
823/*!
824 \fn void QPrintPreviewWidget::paintRequested(QPrinter *printer)
825
826 This signal is emitted when the preview widget needs to generate a
827 set of preview pages. \a printer is the printer associated with
828 this preview widget.
829*/
830
831/*!
832 \fn void QPrintPreviewWidget::previewChanged()
833
834 This signal is emitted whenever the preview widget has changed
835 some internal state, such as the orientation.
836*/
837
838
839QT_END_NAMESPACE
840
841#include "moc_qprintpreviewwidget.cpp"
842#include "qprintpreviewwidget.moc"
843
844#endif // QT_NO_PRINTPREVIEWWIDGET
Note: See TracBrowser for help on using the repository browser.