이 페이지에서

래스터 창 예제

이 예제는 렌더링에 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()를 호출하여 창을 즉시 렌더링합니다.

예제 프로젝트 @ code.qt.io

© 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.