2011年12月26日月曜日

( Qt C++ )QPainterによるQImageへの描画


はい、今回はQPainterによるQImageへの描画をやっていきます。
サンプルは独自のものを使います。
そして、いつものようにQtCreaterなどでMainWindowなどのGUI部品を定義済みであるとします。(QtCreaterなどの使い方は ”Qtをはじめよう" を見てください。)
ではコードを



(mainwindow.h)
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT//マクロ
   
public:
    explicit MainWindow(QWidget *parent = 0);//コンストラクタ
    ~MainWindow();//デストラクタ

protected:
    void paintEvent(QPaintEvent *);//←ここ重要!ペイントイベント
  
private:
    Ui::MainWindow *ui;//uiにはGUI部品が記述
}; 

(mainwindow.cpp)
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)//uiにはGUI部品に関する記述
{
    ui->setupUi(this);//uiのGUI部品の初期化
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::paintEvent(QPaintEvent *)//←重要!ペイントイベント
{
    QImage image(this->size(), QImage::Format_ARGB32_Premultiplied);//空イメージ

    QPainter imagePainter(&image);//空イメージを引数に
    imagePainter.setRenderHint(QPainter::Antialiasing, true);
    imagePainter.drawImage(50,50,QImage("//home//ubuntu001//ShadesOfBlue.jpg"));/*空イメージに画像を描画*/

    QPainter widgetPainter(this);//ウィジット用のQPainter
    widgetPainter.drawImage(0, 0, image);//ウィジットに先ほど描いたイメージ描画
}

少しややこしいですね。理解に重要なのはpaintEventだけですので他は無視してしまっても構いません。
まず空のthis->size(この場合MainWindowのサイズ)の32ビットARGBフォーマットのQImageを作成します。 (リファレンス
その後、このQImage imageに描くためのQPainter imagePainterを作成した空のimageを引数にして定義します。そしてimagePainterにアンチエイリアスをセットし、(50、50)の位置に設定した画像をimageへ描画しています。

この後、ウィジット(この場合MainWindow)に描くためのQPainterを作成し、そこに先ほど描いたimageを描画しています。

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


※なお、このやり方は各プラットフォームのペイントエンジンを使わずQtのペイントエンジンが使われます。つまりどのプラットフォームでも一定の描画結果が得られるというメリットがあります。