Qt/Gcc


                                                                                                                                                               2013.1.14作成
7-4 分割ウィンドウ〜ウィンドウへの描画〜 Pixmap編
自分で描画した図形を画像データで保存するとき、QPixmapを使います。
ここでは、
QPixmapにQPainterをつかって描画して、QPainterをQImageに変換します。
そして、そのImageを画像ファイルとして保存します。保存については、別途説明します。
今回は描画のみ実施してみます。

QPixmapに描画して表示することをダブルバッファリングでの描画とも言います。
この利点は描画途中を表示しないですむことです。QPixmapはメモリ上に存在するため、
描画時は一度メモリ上のQPixmapに描画(画面に現れない)し、描画が終了した
後にQPixmapを画面上(この場合はWindowのView上)に転送して、表示します。
以下のプログラムは、QPixmapを描画するWidgetを別クラスとしました。
クラス名をCPixwidgetとして、基底クラスをQWidgetとします。ここで、cpixwidget.hと
cpixwidget.cppというファイルができます。
やり方は色々ありますが、ここでは、publicで描画するQPixmapを作成して、そこに描画して
そのQPixmapを返す関数を定義して、これにアクセスすることで描画を実施するようにします。

このCPixwidgetクラスを作成します。メニューのファイル-ファイル/プロジェクトの新規作成を選びます。
新規作成で「ファイルとクラス-C++」として、「C++クラス」を選んで「選択」を押します。
次の画面でクラス名、基底クラスを入力します。下記の図1を参照してください。「次へ」を押して、
「完了」を押すと、cpixwidget.hとcpixwidget.cppファイルができています。

  
  図1

上記で作成した各ファイルに描画用の関数を定義します。
・cpixwidget.h
public:
     QPixmap lDrawpixmap(int width,int hight);//この関数を呼び出してpixmapに描画する

実装はcpixwidget.cppファイル内で以下のようにします。
・cpixwidget.cpp
//width:pixmapの幅
//hight:pixmapの高さ
//上記でpixmapのサイズを決定する。このサイズ内に描画する
QPixmap CPixwidget::lDrawpixmap(int width,int hight)
{
    QPixmap pix(width,hight);//pixmapの確保、生成
    QPainter painter(&pix);  //pixmapに対して描画するpainterを作成

//以下、一例

    QRect r(0, 0 ,width,hight);
    painter.fillRect(r, Qt::white);//painterによってpixmapに描画する。これは初期化。白で塗りつぶす。
   
    //以下描画
    QRect rq(0, 0 ,width-1,hight-1);//定義したpixmapの内側に円を書くため、1ドット分削る
    painter.setBrush(Qt::SolidPattern);
    painter.setBrush(QBrush(QColor("yellow")));
    painter.drawEllipse(rq);
    return pix;//描画したpixmapを呼び出し側に返す
}

このクラスをmainwindowの中で使うために、mainwindow.hと.cppに以下を追加します。

・mainwindow.h
以下のヘッダーファイルを追加。
#include <QGraphicsPixmapItem>//pixmapをアイテムとして扱うため
#include "cpixwidget.h"//pixmapを描画するCpixwidgetを使用するため

QGraphicsEllipseItemをQGraphicsPixmapItemに変更する。

  //QGraphicsEllipseItem *item1;//描画用
    QGraphicsPixmapItem *item1;//pixmapItemを使うための変数を追加
 
QPixmapを保存するために、変数を用意する。
private:
   QPixmap px;//pixmapの確保用

 

CPixwidget *gdata;
    gdata = new CPixwidget();

・mainwindow.cpp

InitView1()関数内を以下のように変更する。

void MainWindow::InitView1()
{
    CPixwidget *gdata;//作成したCPixwidgetクラスの変数
    gdata = new CPixwidget();//作成したCPixwidgetクラスを確保する。
 
    px=gdata->lDrawpixmap(200,200);//pixmapへの描画と描画されたpixmapを返す
  //描画したpixmapをシーンに描画する
    item1 = new QGraphicsPixmapItem ();//QGraphicsPixmapItemを確保
    item1->setPixmap(px);//itemに上記で作成したpixmapをセットする。

    m_scene1 = new QGraphicsScene();     //  シーン矩形部分
    m_scene1->setSceneRect(-20,-30,640,480);//set view size ,マイナス座標も設定可m_scene->setSceneRect(-320,-240,640,480);
                                      //viewを大きめにとっておく。windowをドラッグしてviewの領域を超えると表示した画像がずれてくる
    m_scene1->addItem(item1);//pixmapのアイテムをsceneに追加する。
    m_view1 = new QGraphicsView();//viewの生成
    m_view1->setScene(m_scene1);//viewにsceneをセット
    gdata->update();//pixmapの描画実施。念のため。なくても描画できている。
}

図2



インデックスに戻る
トップページに戻る