Qt 印刷サポート
Qt Print Support モジュールは、印刷に関する広範なクロスプラットフォームサポートを提供します。各プラットフォームの印刷システムを使用することで、Qt アプリケーションは接続されたプリンタや、ネットワークを介してリモートプリンタに印刷することができます。印刷システムは PDF ファイルの生成もサポートしており、基本的なレポート生成機能の基盤を提供します。
Qt Print Support は iOS では利用できません。
印刷をサポートするクラス
以下のクラスは、プリンタの選択と設定、印刷出力をサポートします。
プリンタの設定に使用される印刷ダイアログの基本実装 | |
ページ範囲のコレクションを表す | |
プリンタのページ関連オプションの設定ダイアログ | |
プリンタの設定を指定するためのダイアログ | |
QPrinterが与えられた印刷サブシステムとどのように相互作用するかのインタフェースを定義します | |
プリンタ出力用のページレイアウトをプレビューし設定するためのダイアログ | |
プリンタ出力用のページレイアウトをプレビューするためのウィジェット | |
プリンタにペイントするペイントデバイス | |
既存のプリンタに関する情報へのアクセス |
ペイントデバイスと印刷
プリンタはQPrinter で表現され、複数ページや両面出力のサポートなど、印刷に特化した機能を提供するペイントデバイスです。その結果、印刷は、カスタムウィジェットや画像にペイントするのと同じように、QPainter を使って一連のページにペイントすることになります。
QPrinterの作成
QPrinter オブジェクトはユーザーの入力を必要とせずに構築および設定できますが、印刷は多くの場合、ユーザーによる要求の結果として実行されます。たとえば、GUI アプリケーションでユーザーがFile|Print... メニュー項目を選択した場合などです。このような場合、新しく構築されたQPrinter オブジェクトがQPrintDialog に供給され、ユーザーは使用するプリンター、用紙サイズ、その他の印刷プロパティを指定することができる。
QPrinter printer; QPrintDialog dialog(&printer, this); dialog.setWindowTitle(tr("Print Document")); if (editor->textCursor().hasSelection()) dialog.addEnabledOption(QAbstractPrintDialog::PrintSelection); if (dialog.exec() != QDialog::Accepted) return;
また、印刷ダイアログに供給される前にQPrinter を修正することで、特定のデフォルトプロパティを設定することも可能である。例えば、印刷用にレポートのバッチを生成するアプリケーションでは、QPrinter をプリンタではなく、デフォルトでwrite to a local file に設定することができます。
ページへのペイント
QPrinter オブジェクトが構築されセットアップされると、QPainter を使ってペイント操作を行うことができます。次のようにしてペインターを作成し、設定することができます:
QPrinter printer(QPrinter::HighResolution); printer.setOutputFileName("print.ps"); QPainter painter; painter.begin(&printer); for (int page = 0; page < numberOfPages; ++page) { // Use the painter to draw on the page. if (page != lastPage) printer.newPage(); } painter.end();
QPrinter は白紙のページから始まるので、最後のページを除いた各ページを描画した後にnewPage() 関数を呼び出すだけでよい。
end ()を呼び出すと、ドキュメントがプリンタに送られるか、ローカルファイルに書き込まれます。
座標系
QPrinter には、用紙の寸法(用紙の矩形)と印刷可能領域の寸法(ページの矩形)に関する情報を取得するために使用できる関数が用意されています。これらは論理的なデバイス座標で与えられますが、デバイス自体が使用する物理的な座標とは異なる場合があり、これはプリンタがテキストやグラフィックをユーザーのディスプレイよりも(一般的に高い)解像度で描画できることを示しています。
論理座標と物理座標の変換を自分で処理する必要はありませんが、画面に描画するために使用されるピクセルサイズは、一般的なプリンタの高解像度では小さすぎることが多いため、ペイント操作に変換を適用する必要があります。
プリンタ座標系とペインター座標系 paperRect ()とpageRect ()関数は、印刷に使用する用紙のサイズと、その用紙上に描画できる領域に関する情報を提供します。 pageRect() が返す矩形は通常、paperRect() が返す矩形の内側にあります。QPainter QPrinter ペインターの座標系の原点はページの矩形の左上隅と一致し、ペイント操作はページの描画可能な部分の境界にクリップされる。 |
テ キ ス ト を描画す る 際には、 描画シ ス テ ムは自動的に正 し いデバ イ ス メ ト リ ッ ク を用い ますが、 フ ォ ン ト メ ト リ ッ ク か ら 得 ら れた情報を用いてテ キ ス ト を配置す る 必要があ る 場合は、QFontMetrics ・QFontMetricsF オブジ ェ ク ト を構築す る 際に印刷デバ イ ス を指定す る か、QFont を使用す る 際にQPaintDevice を引数 と す る コ ン ス ト ラ ク タ を用いて構築す る 必要があ り ます。
ウィジェットの印刷
ウィジェットを印刷するには、QWidget::render ()関数を使用できます。前述したように、プリンタの解像度は通常画面の解像度よりも高いので、ペインターを拡大縮小する必要があります。また、ウィジェットをページ上に配置したい場合もあるでしょう。次のコード・サンプルは、この方法を示しています。
QPainter painter; painter.begin(&printer); const auto pageLayout = printer.pageLayout(); const auto pageRect = pageLayout.paintRectPixels(printer.resolution()); const auto paperRect = pageLayout.fullRectPixels(printer.resolution()); double xscale = pageRect.width() / double(myWidget->width()); double yscale = pageRect.height() / double(myWidget->height()); double scale = qMin(xscale, yscale); painter.translate(pageRect.x() + paperRect.width() / 2., pageRect.y() + paperRect.height() / 2.); painter.scale(scale, scale); painter.translate(-myWidget->width() / 2., -myWidget->height() / 2.); myWidget->render(&painter);
これは、ウィジェットをページの中央に配置し、ページに合うように拡大縮小します。
複雑なウィジェットからの印刷
QTextEdit やQGraphicsView などの特定のウィジェットは、通常、QTextDocument やQGraphicsScene などの他のクラスのインスタンスによって管理されるリッチコンテンツを表示します。その結果、通常、印刷機能を提供するのは、これらのコンテンツ・ハンドリング・クラスで、完全なタスクを実行するために使用できる関数を使用するか、既存のQPainter オブジェクトを受け入れる関数を使用します。一部のウィジェットは、基本的な印刷機能を公開する便利な関数を提供し、1つの関数を呼び出すためだけにコンテンツ・ハンドラを取得する必要性を回避しています。
次の表は、さまざまなウィジェットの中から、どのクラスと関数が印刷を担当するかを示しています。印刷機能を直接公開していないウィジェットについては、この機能を含むコンテンツハンドリングクラスを、対応するウィジェットのAPIの関数経由で取得できます。
ウィジェット | 印刷機能 | 受け付ける |
---|---|---|
QGraphicsView | QGraphicsView::render() | QPainter |
QSvgWidget | QSvgRenderer::render() | QPainter |
QTextEdit | QTextDocument::print() | QPrinter |
QTextLayout | QTextLayout::draw() | QPainter |
QTextLine | QTextLine::draw() | QPainter |
QTextEdit は ではなく を必要とします。 これは、設定されたページ寸法に関する情報を使用して、 印刷されたドキュメント内の最も適切な場所に改ページを挿入するためです。QPainter QPrinter
モジュールの使用
Qt モジュールを使用するには、モジュール・ライブラリを直接リンクするか、他の依存関係を通してリンクする必要があります。CMakeや qmakeなど、いくつかのビルドツールはこのための専用サポートを持っています。
CMake でのビルド
find_package()
コマンドを使って、Qt6
パッケージの中から必要なモジュールコンポーネントを探します:
find_package(Qt6 REQUIRED COMPONENTS PrintSupport) target_link_libraries(mytarget PRIVATE Qt6::PrintSupport)
CMakeによるビルドの概要も参照してください。
qmakeでビルドする
モジュールをqmakeでビルドするように設定するには、プロジェクトの.proファイルにQT
変数の値としてモジュールを追加します:
QT += printsupport
モジュールの進化
Qt Print Support の変更点には、Qt 6 シリーズの Qt で行われたモジュール API と機能の重要な変更が記載されています。
ライセンスと商標
Qt Print Support モジュールは、The Qt Company の商用ライセンスで利用できます。さらに、フリーソフトウェアライセンスでも利用可能です:GNU Lesser General Public License, version 3 またはGNU General Public License, version 2。詳細はQt ライセンスを参照してください。
Adobe®は、その商標(ロゴを含む)をPDFと組み合わせて使用することに制限を設けていることに注意してください。ガイドラインはwww.adobe.comを参照してください。
©2024 The Qt Company Ltd. 本書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。