2011年12月30日金曜日

( Qt C++ )QTextDocumentを用いたテキストの印刷


はい、それではQTextDocumentを使ったテキストの印刷をやっていきます。
QTextDocumentクラスは書式設定されたテキストの保持や表示、編集のためのクラスです。
詳しいことはリファレンスを参照してください。

サンプルはC++ GUI Programming with Qt4の192ページのものを少し変更し使います。
そして、いつものようにQtCreaterなどでMainWindowなどのGUI部品を定義済みであるとします。(QtCreaterなどの使い方は ”Qtをはじめよう" を見てください。)
ではコードを

MainWindow::on_pushButton_clicked()//ボタンクリックスロット
{
    QStringList stringList;//印刷に使われる文字列リスト
    stringList << "Title1: This is Sample1. That is Sample1.";
    stringList << "Title2: This is Sample2. That is Sample2.";
    stringList << "Title3: This is Sample3. That is Sample3.";
    stringList << "Title4: This is Sample4. That is Sample4.";

    QString html;

    foreach(QString entry, stringList)
    {
        QStringList fields = entry.split(": ");//  ": "で分割する
        QString title = Qt::escape(fields[0]);//エスケープする
        QString body = Qt::escape(fields[1]);//エスケープする

        html += "<table width=\"100%\" border=1 cellspacing=0>\n"
                "<tr><td bgcolor=\"lightgray\"><font size=\"+1\">"
                "<b><i>" + title + "</i></b></font>\n<tr><td>" + body
                + "\n</table>\n" + "<br>\n";
    }

    QPrinter printer(QPrinter::ScreenResolution);//プリンター描画のためのペイントデバイス
    QPrintDialog printDialog(&printer, this);//印刷するかどうかのダイアログ表示

    if(printDialog.exec() == QDialog::Accepted)//OKなら印刷
    {
        QTextDocument textDocument;
        textDocument.setHtml(html);//HTML文字列をセット
        textDocument.print(&printer);//印刷
    }
}

少し長いですね。ですがやってることは単純です。
まずQStringListを作成しています。ここで作ったものが印刷に使われます。
次にQStringListを走査し、タイトルとそれ以外に分離し書式をHTMLで整形してQString htmlに追加格納していきます。(escapeの詳細はリファレンスへ)
その次にQPrinterを作成し、プリントダイアログを表示させ印刷の確認を表示させます。
OKが押されたらQTextDocumentを定義し、setHtmlで先ほど作成したQString htmlをセットし、印刷します。(setHtmlの詳細はリファレンスへ

実行すると以下のようになります。

印刷したものは以下のようになります。
 
以上です。