印刷プレビューの表示
テキストエディットなどで印刷前にプレビューを表示したい場合、QPrintPreviewDialogを使うと印刷プレビューを簡単に表示することができます。
具体的にどのようにプレビューを表示するかというと次の手順でQPrinterを作り、そこに内容を描画します。
- QPrintPreviewDialogを作る
- ダイアログのpaintRequestedシグナルと印刷処理をするスロットをコネクトする
- 印刷処理するスロット関数内でテキストや図形を描画
大雑把にいうとこのような手順です。
印刷プレビューダイアログの実装例
初めに印刷プレビューを表示するウィジェットとして次のようなQPlainTextEditを継承したクラスを作ります。
#ifndef PRINTDEMOEDIT_H #define PRINTDEMOEDIT_H #include <QPlainTextEdit> #include <QPrinter> #include <QPainter> class PrintDemoEdit : public QPlainTextEdit { Q_OBJECT public: explicit PrintDemoEdit(QWidget * parent = 0) : QPlainTextEdit(parent) {} ~PrintDemoEdit(){} public slots: /** paintRequestedシグナルが発信されたときに実行する処理*/ void printPreview(QPrinter * printer) { QPainter painter(printer); int y = 0; QTextBlock block = document()->begin(); while(block != document()->end()){ QRect * rect = new QRect(); painter.drawText(0, y, printer->width(), printer->height(), Qt::TextWordWrap, block.text(), rect); ///折り返しありでテキストを描画 y += rect->height(); /** 空行の場合スキップ*/ if(block.text().isEmpty()) y += fm.height(); block = block.next(); /** ページ高さを超えたら新しいページに移る。*/ if(y > pageHeight){ printer->newPage(); y = 0; } } } }; #endif // PRINTDEMOEDIT_H
printPreview関数が次に紹介するprintRequestedシグナルが発信されたときに印刷プレビューを描画するスロット関数です。
もし印刷ページの高さを超えてしまった場合はnewPage関数で新しいページに移ることができます。
印刷プレビューの表示
次にウィジェットを元に印刷プレビューを表示します。
int main(int argc, char * argv[]) { QApplication a(argc, argv); QPrinter * printer = new QPrinter(); printer->setPaperSize(QPrinter::A4); printer->setOrientation(QPrinter::Portrait); printer->setFullPage(true); QPrintPreviewDialog previewDialog(printer); edit->connect(&previewDialog, SIGNAL(paintRequested(QPrinter*)), edit, SLOT(printPreview(QPrinter*))); previewDialog.exec(); return a.exec(); }
QPrintPreviewDialogにはQPrinterを渡し、印刷設定が変わるたびにpaintRequestedが呼ばれプレビューが再描画されます。
プレビューは次の画像ように表示されます。ここではA4サイズの縦向きに設定しました。
この場合、コードを簡単にするためにマージンのことやブロックが印刷プレビューからはみだした場合の処理は省略しましたが、実装はそんなに難しくありません。
以上、印刷プレビューの表示方法でした。では、また!
関連項目
© Kaz