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