はい、今回は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のペイントエンジンが使われます。つまりどのプラットフォームでも一定の描画結果が得られるというメリットがあります。