カンテラの光の下で

dNaga392's memorandom

【Qt】【QWidget】ウィジェットの画面を描画する

ウィジェットの画面を他のペイントデバイス(QPaintDeviceの派生クラス)に描画する方法です。

// QPixmapにウィジェットの表示を直接描画する方法

QWidget *w = new QWidget();

// 描画内容の設定
QLabel *lbl = new QLabel("Hello world.");
QVBoxLayout *layout = new QVBoxLayout();
layout->addWidget(lbl);
w->setLayout(layout);

// 描画先の用意
// ウィジェットと同じサイズを用意
QPixmap pix(w->size());

// ウィジェットの描画
// まず表示してウィジェットの描画イベントを走らせる
w->show();
// 描画内容を複写
w->render(&pix);
// 複写内容を保存(確認用)
pix.save("hello.png");

QWidget を表示せず描画する場合は、ウィジェットに Qt::WA_DontShowOnScreen を設定します。

// QPixmapにウィジェットの内容を非表示で直接描画する方法

QWidget *w = new QWidget();

// 描画内容の設定
// (略)

// 描画先の用意
// (略)

// ウィジェットの描画
// スクリーンに表示しない設定とする
w->setAttribute(Qt::WA_DontShowOnScreen);
// showしてウィジェットの描画イベントを走らせる
w->show();
// 描画内容を複写
w->render(&pix);
// 複写内容を保存(確認用)
pix.save("hello.png");

ここまで QPixmap に描画しましたが、render関数は QPainter を引数にすることもできます。

// QPainterを介してウィジェットの表示を描画する方法

QWidget *w = new QWidget();

// 描画内容の設定
// (略)

// 描画先の用意
// ウィジェットと同じサイズを用意
QPixmap pix(w->size());
// QPainterに描画先を設定
QPainter p(&pix);

// ウィジェットの描画
// まず表示してウィジェットの描画イベントを走らせる
w->show();
// QPainterを介して描画内容を複写
w->render(&p);
// 複写内容を保存(確認用)
pix.save("hello.png");

参考

c++ - Qt: How to force a hidden widget to calculate its layout? - Stack Overflow