印刷プレビューの表示

テキストエディットなどで印刷前にプレビューを表示したい場合、QPrintPreviewDialogを使うと印刷プレビューを簡単に表示することができます。

具体的にどのようにプレビューを表示するかというと次の手順でQPrinterを作り、そこに内容を描画します。

  1. QPrintPreviewDialogを作る
  2. ダイアログのpaintRequestedシグナルと印刷処理をするスロットをコネクトする
  3. 印刷処理するスロット関数内でテキストや図形を描画

大雑把にいうとこのような手順です。

印刷プレビューダイアログの実装例

初めに印刷プレビューを表示するウィジェットとして次のような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サイズの縦向きに設定しました。

印刷プレビュー

この場合、コードを簡単にするためにマージンのことやブロックが印刷プレビューからはみだした場合の処理は省略しましたが、実装はそんなに難しくありません。

以上、印刷プレビューの表示方法でした。では、また!

関連項目
プライバシーポリシー