2011年12月31日土曜日

( Qt C++ )QPainterを用いた印刷位置を移動させながらの印刷


はい、それではQPainterを用いた印刷位置を移動させながらの印刷をやっていきます。
サンプルは独自のものを使います。
そして、いつものようにQtCreaterなどでMainWindowなどのGUI部品を定義済みであるとします。(QtCreaterなどの使い方は ”Qtをはじめよう" を見てください。)
ではコードを

void MainWindow::on_pushButton_clicked()//ボタンクリックスロット
{
    QString text = "Sample PDF Print !!";

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

    if(printDialog.exec() == QDialog::Accepted)//OKなら印刷
    {
        QPainter painter(&printer);
        painter.setFont(QFont());//フォント設定(この場合デフォルト)
        painter.setPen(QPen(Qt::black, 2, Qt::SolidLine));//ペンをセット
        painter.setBrush(QBrush(Qt::gray, Qt::SolidPattern));//ブラシセット

        painter.drawText(painter.window(), Qt::AlignHCenter, text);//タイトル描画

        painter.translate(0, 40);//現在地から(0,40)、つまり下に40移動
        painter.drawRect(0, 0, painter.window().width(), 40);//四角形描画

        painter.translate(0, 60);//現在地から(0,60)、つまり下に60移動
        painter.drawRect(0, 0, painter.window().width(), 40);

        painter.translate(0, 80);//現在地から(0,80)、つまり下に80移動
        painter.drawRect(0, 0, painter.window().width(), 40);

        painter.translate(0, 100);//現在地から(0,100)、つまり下に100移動
        painter.drawRect(0, 0, painter.window().width(), 40);
    }
}

はい、簡単ですね。プリントダイアログの表示まではいいですね。そのまんまです。
次にQPainterを作成し、順にペン、ブラシをセットし、タイトルである "Sample PDF Print !!"を印刷します。
次にpainter.translateを呼び出しています。これは絶対座標の指定ではなく現在の位置からの座標移動になります。(リファレンス
その後、drawRectで四角形を描画し、これら移動→四角形描画を3度繰り返します。(リファレンス

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


印刷されたものは以下のようになります。
 
 以上です。なお、今日からブログ名が「タンスの引き出し」になります。では、また来年!

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の詳細はリファレンスへ

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

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