래스터 창 예제

이 예는 렌더링에 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 의 하위 창이 될 수 있는 생성자를 제공합니다. 부모가 없는 QWindows는 창 시스템에서 최상위 창으로 표시됩니다.

이 클래스는 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가 호출되므로 이 함수가 필요합니다. 창이 표시되면 렌더나우()를 호출하여 창을 즉시 그립니다. 시스템에 시각적 콘텐츠를 표시할 수 있도록 즉시 그리기를 원합니다.

void RasterWindow::resizeEvent(QResizeEvent *resizeEvent)
{
    m_backingStore->resize(resizeEvent->size());
}

크기 조정 이벤트는 창이 화면에 표시되기 전에 호출되도록 보장되며, 화면에 표시되는 동안 창 크기가 조정될 때마다 호출됩니다. 이를 사용하여 백 버퍼의 크기를 조정하고 해당/다음 노출 이벤트로 렌더링을 연기합니다.

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 함수는 QWindowQPainter 을 사용하여 콘텐츠를 렌더링하는 데 필요한 사항을 설정합니다. 가려진 창은 표시되지 않으므로 창이 윈도우 시스템에서 노출되지 않으면 중단됩니다. 예를 들어 다른 창이 이 창을 완전히 가리는 경우 이런 일이 발생할 수 있습니다.

그리려는 영역에서 QBackingStore::beginPaint()를 호출하여 그리기를 시작합니다. 그런 다음 백 버퍼의 QPaintDevice 을 가져와 QPainter 을 생성하여 해당 페인트 장치에 렌더링합니다.

이전 렌더링의 흔적을 남기지 않고 깨끗한 버퍼로 시작하려면 전체 버퍼를 흰색으로 채웁니다. 그런 다음 이 창의 실제 그리기를 수행하는 가상 렌더링() 함수를 호출합니다.

그리기가 완료되면 endPaint()를 호출하여 렌더링이 완료되었음을 알리고 QBackingStore::flush()를 사용하여 백 버퍼에 내용을 표시합니다.

void RasterWindow::render(QPainter *painter)
{
    painter->drawText(QRectF(0, 0, width(), height()), Qt::AlignCenter, QStringLiteral("QWindow"));
}

렌더 함수에는 창에 대한 그리기 코드가 포함되어 있습니다. 이 간단한 예제에서는 중앙에 "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() 함수를 다시 구현합니다. 이벤트가 들어오면 렌더나우()를 호출하여 창을 즉시 렌더링합니다.

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

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