ラスターウィンドウの例
このサンプルでは、QPainter を使用して描画を行う、QWindow ベースの最小限のアプリケーションを作成する方法を示します。
アプリケーションのエントリポイント
int main(int argc, char **argv)
{
QGuiApplication app(argc, argv);
RasterWindow window;
window.show();
return app.exec();
}QWindow ベースのアプリケーションのエントリポイントは、QGuiApplication クラスです。このクラスは、GUI アプリケーションの制御フローと主要な設定を管理します。特定のシステム全体のオプションを取得するために使用できるコマンドライン引数をこのクラスに渡します。
その後、ウィンドウインスタンスを作成し、QWindow::show() 関数を呼び出して、このウィンドウを画面上に表示するようウィンドウシステムに指示します。
これが完了すると、アプリケーションの実行を開始するために、アプリケーションのイベントループに入ります。
RasterWindowの宣言
#include <QtGui>
#include <QScopedPointer>
class RasterWindow : public QWindow
{
Q_OBJECT
public:
explicit RasterWindow(QWindow *parent = nullptr);
virtual void render(QPainter *painter);
public slots:
void renderLater();
void renderNow();
protected:
bool event(QEvent *event) override;
void resizeEvent(QResizeEvent *event) override;
void exposeEvent(QExposeEvent *event) override;
private:
QScopedPointer<QBackingStore> m_backingStore;
};まず、<QtGui> ヘッダーをインクルードします。これにより、Qt GUI モジュール内のすべてのクラスを使用できるようになります。必要に応じて、クラスを個別にインクルードすることも可能です。
RasterWindowクラスはQWindow を直接継承しており、このウィンドウを別のQWindow のサブウィンドウとして設定できるコンストラクタを提供します。親を持たないQWindowは、ウィンドウシステム上でトップレベルウィンドウとして表示されます。
このクラスは、QPainter ベースのグラフィックス用にウィンドウのバックバッファを管理するために使用するQBackingStore を宣言しています。
このラスタウィンドウは他のいくつかの例でも再利用されており、renderLater() などのヘルパー関数がいくつか追加されています。
RasterWindow の実装
RasterWindow::RasterWindow(QWindow *parent)
: QWindow(parent)
, m_backingStore(new QBackingStore(this))
{
setGeometry(100, 100, 300, 200);
}コンストラクタでは、バッキングストアを作成し、それが管理すべきウィンドウインスタンスを渡します。また、ウィンドウの初期ジオメトリも設定します。
void RasterWindow::exposeEvent(QExposeEvent *)
{
if (isExposed())
renderNow();
}作成されたウィンドウに対してQWindow::show()を呼び出すと、まもなく仮想関数QWindow::exposeEvent()が呼び出され、ウィンドウシステムにおけるウィンドウの表示状態が変更されたことが通知されます。このイベントには表示されているサブ領域が含まれていますが、いずれにせよ毎回ウィンドウ全体を描画するため、これを利用することはありません。
QWindow::isExposed() 関数は、ウィンドウが表示されているかどうかを通知します。ウィンドウがウィンドウシステム内で非表示になった場合にも exposeEvent が呼び出されるため、この情報が必要となります。ウィンドウが表示されている場合は、renderNow() を呼び出して直ちにウィンドウを描画します。システムに視覚的なコンテンツを提示できるように、すぐに描画を行いたいからです。
void RasterWindow::resizeEvent(QResizeEvent *resizeEvent)
{
m_backingStore->resize(resizeEvent->size());
}resizeイベントは、ウィンドウが画面に表示される前に確実に呼び出され、画面上に表示されている間にウィンドウのサイズが変更される際にも常に呼び出されます。これを利用してバックバッファのサイズを変更し、レンダリングを対応する、あるいは直後のexposeイベントまで延期します。
void RasterWindow::renderNow()
{
if (!isExposed())
return;
QRect rect(0, 0, width(), height());
m_backingStore->beginPaint(rect);
QPaintDevice *device = m_backingStore->paintDevice();
QPainter painter(device);
painter.fillRect(0, 0, width(), height(), QGradient::NightFade);
render(&painter);
painter.end();
m_backingStore->endPaint();
m_backingStore->flush(rect);
}renderNow関数は、QWindow がQPainter を使用してコンテンツをレンダリングするために必要な設定を行います。隠れているウィンドウは表示されないため、ウィンドウシステムでウィンドウが露出していない場合は処理を中止します。これは、例えば別のウィンドウがこのウィンドウを完全に覆い隠している場合などに発生します。
描画を開始するには、描画対象の領域に対してQBackingStore::beginPaint()を呼び出します。次に、バックバッファのQPaintDevice を取得し、そのペイントデバイスにレンダリングするためのQPainter を作成します。
前回のレンダリングの痕跡が残らないようにし、クリーンなバッファから開始するために、バッファ全体を白色で塗りつぶします。その後、このウィンドウの実際の描画を行う仮想関数 `render()` を呼び出します。
描画が完了したら、endPaint()を呼び出してレンダリングが終了したことを通知し、QBackingStore::flush()を使用してバックバッファの内容を表示します。
void RasterWindow::render(QPainter *painter)
{
painter->drawText(QRectF(0, 0, width(), height()), Qt::AlignCenter, QStringLiteral("QWindow"));
}render関数には、ウィンドウの描画コードが含まれています。このごく簡単な例では、中央に「QWindow 」という文字列を描画するだけです。
非同期レンダリング
void RasterWindow::renderLater()
{
requestUpdate();
}これまで、ウィンドウを直ちに再描画する必要があった箇所をいくつか見てきました。しかし、これが望ましくない場合もあり、その場合はアプリケーションをイベントループに戻し、再描画を後ほどスケジュールするようにしたい場合があります。これを実現するには、QWindow::requestUpdate() を使用して更新を要求します。これにより、システムが再描画の準備が整った時点で更新が実行されます。
bool RasterWindow::event(QEvent *event)
{
if (event->type() == QEvent::UpdateRequest) {
renderNow();
return true;
}
return QWindow::event(event);
}更新イベントを処理するために、仮想関数QObject::event() を再実装します。イベントが発生したら、renderNow() を呼び出してウィンドウを直ちにレンダリングします。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.