【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