QQuickRenderControl Class

QQuickRenderControl 클래스는 Qt Quick 시나리오 그래프를 완전히 애플리케이션 제어 방식으로 오프스크린 렌더링 타겟에 렌더링하는 메커니즘을 제공합니다. 더 보기...

Header: #include <QQuickRenderControl>
CMake: find_package(Qt6 REQUIRED COMPONENTS Quick)
target_link_libraries(mytarget PRIVATE Qt6::Quick)
qmake: QT += quick
상속합니다: QObject

공용 함수

QQuickRenderControl(QObject *parent = nullptr)
virtual ~QQuickRenderControl() override
(since 6.0) void beginFrame()
(since 6.6) QRhiCommandBuffer *commandBuffer() const
(since 6.0) void endFrame()
(since 6.0) bool initialize()
void invalidate()
void polishItems()
void prepareThread(QThread *targetThread)
void render()
virtual QWindow *renderWindow(QPoint *offset)
(since 6.6) QRhi *rhi() const
(since 6.0) int samples() const
(since 6.0) void setSamples(int sampleCount)
bool sync()
(since 6.0) QQuickWindow *window() const

시그널

정적 공용 멤버

QWindow *renderWindowFor(QQuickWindow *win, QPoint *offset = nullptr)

상세 설명

QQuickWindowQQuickView 및 관련 내부 렌더 루프는 Qt Quick 장면을 기본 창에 렌더링합니다. 예를 들어 타사 OpenGL, Vulkan, Metal 또는 Direct 3D 렌더러와 통합하는 경우 외부 렌더링 엔진에서 임의의 방식으로 사용할 수 있는 텍스처로 씬을 가져오는 것이 유용할 수 있습니다. 이러한 메커니즘은 VR 프레임워크와 통합할 때도 필수적입니다. 성능 면에서 제한적인 QQuickWindow::grabWindow()를 사용하는 대안과 달리 QQuickRenderControl은 하드웨어 가속 방식으로 이를 가능하게 합니다.

QQuickRenderControl을 사용할 때 QQuickWindowshown 이 아니어야 하며(화면에 표시되지 않음), 이를 위한 기본 네이티브 창이 없어야 합니다. 대신 QQuickWindow 인스턴스는 QQuickWindow 생성자의 오버로드를 사용하여 렌더링 컨트롤 객체와 QQuickWindow::setRenderTarget()를 통해 지정된 텍스처 또는 이미지 객체와 연결됩니다. QQuickWindow 객체는 Qt Quick 장면을 나타내고 대부분의 장면 관리 및 이벤트 전달 메커니즘을 제공하므로 여전히 필수적입니다. 그러나 윈도우 시스템의 관점에서 볼 때 실제 화면상의 창 역할을 하지는 않습니다.

그래픽 디바이스, 컨텍스트, 이미지 및 텍스처 오브젝트의 관리는 애플리케이션에 달려 있습니다. initialize ()을 호출하기 전에 Qt Quick 에서 사용할 장치 또는 컨텍스트를 만들어야 합니다. 텍스처 객체 생성은 연기할 수 있습니다(아래 참조). Qt 5.4에서는 QOpenGLContext 에서 기존 네이티브 컨텍스트를 채택할 수 있는 기능이 도입되었습니다. QQuickRenderControl과 함께 사용하면 외부 렌더링 엔진의 기존 컨텍스트와 공유하는 QOpenGLContext 을 만들 수 있습니다. 그러면 이 새로운 QOpenGLContext 을 사용하여 Qt Quick 씬을 다른 엔진의 컨텍스트에서도 액세스할 수 있는 텍스처로 렌더링할 수 있습니다. Vulkan, Metal 및 Direct 3D의 경우 장치 객체에 대한 Qt 제공 래퍼가 없으므로 QQuickWindow::setGraphicsDevice()를 통해 기존 객체를 그대로 전달할 수 있습니다.

QML 컴포넌트의 로드 및 인스턴스화는 QQmlEngine 을 사용하여 이루어집니다. 루트 객체가 생성되면 QQuickWindow 의 contentItem()에 부모를 지정해야 합니다.

애플리케이션은 일반적으로 4가지 중요한 신호에 연결해야 합니다:

마우스 또는 키보드 이벤트와 같은 이벤트를 씬으로 보내려면 QQuickWindow 인스턴스를 수신자로 하여 QCoreApplication::sendEvent()를 사용합니다.

키 이벤트의 경우 원하는 항목에 수동으로 초점을 설정해야 할 수도 있습니다. 실제로는 원하는 항목(예: 장면의 루트 항목)이 장면( QQuickWindow)과 연결된 후 forceActiveFocus()을 호출합니다.

참고: 일반적으로 QQuickRenderControl은 모든 Qt Quick 백엔드와 함께 지원됩니다. 그러나 일부 기능, 특히 grab()은 모든 경우에 사용 가능하지 않을 수 있습니다.

멤버 함수 문서

[explicit] QQuickRenderControl::QQuickRenderControl(QObject *parent = nullptr)

부모 오브젝트 parent 를 사용하여 QQuickRenderControl 오브젝트를 생성합니다.

[override virtual noexcept] QQuickRenderControl::~QQuickRenderControl()

인스턴스를 파괴합니다. 모든 시나리오 그래프 리소스를 해제합니다.

invalidate()도 참조하세요 .

[since 6.0] void QQuickRenderControl::beginFrame()

그래픽 프레임의 시작을 지정합니다. sync () 또는 render()에 대한 호출은 시작 프레임() 및 endFrame() 호출로 묶어야 합니다.

Qt 5의 이전 OpenGL 전용 세계와 달리 다른 그래픽 API로 렌더링하려면 프레임의 시작과 끝 지점을 더 잘 정의해야 합니다. QQuickRenderControl 를 통해 렌더링 루프를 수동으로 구동할 때 이제 이러한 지점을 지정하는 것은 QQuickRenderControl 의 사용자에게 달려 있습니다.

기존 텍스처에 렌더링을 초기화하는 것을 포함한 일반적인 업데이트 단계는 다음과 같이 보일 수 있습니다. 이 예제 코드 조각은 Direct3D 11을 가정하지만 동일한 개념이 다른 그래픽 API에도 적용됩니다.

if (!m_quickInitialized) {  m_quickWindow->setGraphicsDevice(QQuickGraphicsDevice::fromDeviceAndContext(m_engine->device(),  m_engine->context())); if (!m_renderControl->initialize()))        qWarning("Failed to initialize redirected Qt Quick rendering");

    m_quickWindow->setRenderTarget(QQuickRenderTarget::fromNativeTexture({ quint64(m_res.texture), 0},  QSize(QML_WIDTH, QML_HEIGHT),SAMPLE_COUNT)); m_quickInitialized = true; }  m_renderControl->polishItems();  m_renderControl->beginFrame();  m_renderControl->sync();  m_renderControl->render();  m_renderControl->endFrame(); // Qt Quick 의 렌더 명령은 여기
의 장치 컨텍스트로 전송됩니다.

참고: 이 함수는 Qt Quicksoftware 적응을 사용할 때 호출할 필요도 없고, 호출해서도 안 됩니다.

참고: 내부적으로 시작프레임() 및 endFrame()은 각각 beginOffscreenFrame() 및 endOffscreenFrame()를 호출합니다. 이는 이 함수가 호출될 때 QRhi 에 (오프스크린 또는 스왑체인 기반의) 프레임이 기록되고 있지 않아야 함을 의미합니다.

이 함수는 Qt 6.0에 도입되었습니다.

endFrame(), initialize(), sync(), render(), QQuickGraphicsDevice, 및 QQuickRenderTarget도 참조하세요 .

[since 6.6] QRhiCommandBuffer *QQuickRenderControl::commandBuffer() const

현재 명령 버퍼를 반환합니다.

beginFrame()가 호출되면 QRhiCommandBuffer 이 자동으로 설정됩니다. 이것이 Qt Quick 시나리오가 사용하는 명령 버퍼이지만, 경우에 따라 애플리케이션에서 리소스 업데이트(예: 텍스처 읽기백)를 실행하기 위해 쿼리해야 할 수도 있습니다.

반환된 명령 버퍼 참조는 beginFrame()와 endFrame() 사이에서만 사용해야 합니다. 예를 들어 endFrame() 바로 뒤의 명령 버퍼에서 다음 beginFrame() 전에 lastCompletedGpuTime()를 호출하는 것은 유효하지만, 특정 예외가 있습니다.

참고: 이 함수는 Qt Quicksoftware 각색을 사용할 때는 적용되지 않으며 null을 반환합니다.

이 함수는 Qt 6.6에 도입되었습니다.

rhi(), beginFrame() 및 endFrame()도 참조하십시오 .

[since 6.0] void QQuickRenderControl::endFrame()

그래픽 프레임의 끝을 지정합니다. sync () 또는 render()에 대한 호출은 beginFrame() 및 endFrame() 호출로 묶어야 합니다.

이 함수가 호출되면 시나리오에 의해 큐에 대기 중인 모든 그래픽 명령이 컨텍스트 또는 명령 큐 중 해당되는 것으로 제출됩니다.

참고: 이 함수는 Qt Quicksoftware 적응을 사용할 때는 호출할 필요가 없으며, 호출해서도 안 됩니다.

이 함수는 Qt 6.0에 도입되었습니다.

beginFrame(), initialize(), sync(), render(), QQuickGraphicsDevice, 및 QQuickRenderTarget도 참조하십시오 .

[since 6.0] bool QQuickRenderControl::initialize()

씬 그래프 리소스를 초기화합니다. Qt Quick 렌더링에 Vulkan, Metal, OpenGL 또는 Direct3D와 같은 그래픽 API를 사용하는 경우 이 함수가 호출되면 QQuickRenderControl 이 적절한 렌더링 엔진을 설정합니다. 이 렌더링 인프라는 QQuickRenderControl 가 존재하는 한 존재합니다.

Qt Quick 에서 사용하는 그래픽 API를 제어하려면 QSGRendererInterface:GraphicsApi 상수 중 하나를 사용하여 QQuickWindow::setGraphicsApi()를 호출하세요. 이 함수를 호출하기 전에 이 작업을 수행해야 합니다.

시나리오가 자체 장치 및 컨텍스트 객체를 생성하지 않도록 하려면 QQuickWindow::setGraphicsDevice()를 호출하여 기존 그래픽 객체를 래핑하는 적절한 QQuickGraphicsDevice 을 지정합니다.

활성화할 디바이스 확장을 구성하려면(예: Vulkan의 경우) 이 함수 앞에 QQuickWindow::setGraphicsConfiguration()를 호출합니다.

참고: Vulkan을 사용하는 경우 QQuickRenderControlQVulkanInstance 을 자동으로 생성하지 않습니다. 대신 QQuickWindow 을 사용하여 적절한 QVulkanInstanceassociate it 을 생성하는 것은 애플리케이션의 책임입니다. QVulkanInstance 을 초기화하기 전에 정적 함수 QQuickGraphicsConfiguration::preferredInstanceExtensions()를 호출하여 Qt Quick 의 원하는 인스턴스 확장 목록을 쿼리하고 반환된 목록을 QVulkanInstance::setExtensions()에 전달하는 것이 좋습니다.

성공하면 true, 그렇지 않으면 false 을 반환합니다.

참고: 이 함수는 Qt Quicksoftware 각색을 사용할 때 호출할 필요도 없고, 호출해서도 안 됩니다.

기본 Qt Quick 적응을 사용하면 이 함수는 QQuickRenderControl 을 사용하지 않을 때 화면상의 QQuickWindow 에서 발생하는 것과 유사하게 새 QRhi 객체를 만듭니다. 이 새 QRhi 개체가 기존 장치 또는 컨텍스트 리소스를 채택하도록 하려면(예: 새 개체를 만드는 대신 기존 QOpenGLContext 사용) 위에서 언급한 대로 QQuickWindow::setGraphicsDevice()를 사용합니다. 애플리케이션에서 Qt Quick 렌더링이 이미 존재하는 QRhi 객체를 사용하도록 하려는 경우 QQuickGraphicsDevice::fromRhi()를 통해서도 가능합니다. 이미 존재하는 QRhi 을 참조하는 QQuickGraphicsDevice 이 설정된 경우 초기화()에서 새로운 전용 QRhi 객체가 생성되지 않습니다.

이 함수는 Qt 6.0에 도입되었습니다.

QQuickRenderTarget, QQuickGraphicsDevice, 및 QQuickGraphicsConfiguration::preferredInstanceExtensions()도 참조하십시오 .

void QQuickRenderControl::invalidate()

렌더링을 중지하고 리소스를 해제합니다.

이는 창이 숨겨질 때 실제 QQuickWindow 에서 발생하는 정리 작업과 동일합니다.

이 함수는 소멸자에서 호출됩니다. 따라서 일반적으로 직접 호출할 필요가 없습니다.

invalidate()가 호출된 후에는 initialize()를 다시 호출하여 QQuickRenderControl 인스턴스를 재사용할 수 있습니다.

참고: 이 함수는 QQuickWindow::persistentSceneGraph() 또는 QQuickWindow::persistentGraphics()를 고려하지 않습니다. 즉, 컨텍스트별 리소스는 항상 해제됩니다.

void QQuickRenderControl::polishItems()

이 함수는 sync() 이전에 가능한 한 늦게 호출해야 합니다. 스레드 시나리오에서는 렌더링이 이 함수와 병렬로 이루어질 수 있습니다.

void QQuickRenderControl::prepareThread(QThread *targetThread)

GUI 스레드 외부에서 Qt Quick 장면 렌더링을 준비합니다.

targetThread 동기화 및 렌더링이 수행될 스레드를 지정합니다. 단일 스레드 시나리오에서는 이 함수를 호출할 필요가 없습니다.

void QQuickRenderControl::render()

현재 컨텍스트를 사용하여 시나리오 그래프를 렌더링합니다.

[signal] void QQuickRenderControl::renderRequested()

이 신호는 씬 그래프를 렌더링해야 할 때 방출됩니다. sync ()를 호출할 필요는 없습니다.

참고: 이 신호가 방출될 때 렌더링을 직접 트리거하지 마세요. 대신 타이머 등을 사용하여 지연시키는 것이 좋습니다. 이렇게 하면 성능이 향상됩니다.

[virtual] QWindow *QQuickRenderControl::renderWindow(QPoint *offset)

이 렌더링 컨트롤이 렌더링되는 실제 창을 반환하기 위해 서브클래스에서 재구현됩니다.

offset 이 null이 아닌 경우, 창 내부의 컨트롤 오프셋으로 설정됩니다.

참고: 필수는 아니지만, 이 함수를 다시 구현하는 것은 다양한 기기 픽셀 비율의 여러 화면을 지원하고 QML에서 열린 팝업 창을 적절히 배치하는 데 필수적입니다. 따라서 서브클래스로 제공하는 것이 좋습니다.

[static] QWindow *QQuickRenderControl::renderWindowFor(QQuickWindow *win, QPoint *offset = nullptr)

win 가 렌더링되고 있는 실제 창(있는 경우)을 반환합니다.

offset 이 null이 아닌 경우, 해당 창 내부의 렌더링 오프셋으로 설정됩니다.

[since 6.6] QRhi *QQuickRenderControl::rhi() const

QQuickRenderControl 이 연결된 QRhi 을 반환합니다.

참고: initialize()이 성공적으로 완료된 경우에만 QRhi 이 존재합니다. 그 전에는 반환값이 null입니다.

참고: 이 함수는 Qt Quicksoftware 변환을 사용할 때는 적용되지 않으며 null을 반환합니다.

이 함수는 Qt 6.6에 도입되었습니다.

commandBuffer(), beginFrame() 및 endFrame()도 참조하세요 .

[since 6.0] int QQuickRenderControl::samples() const

현재 샘플 수를 반환합니다. 1 또는 0은 멀티샘플링이 없음을 의미합니다.

이 함수는 Qt 6.0에 도입되었습니다.

setSamples()도 참조하십시오 .

[signal] void QQuickRenderControl::sceneChanged()

이 신호는 씬 그래프가 업데이트될 때 발생하며, polishItems() 및 sync()를 호출해야 함을 의미합니다. sync ()가 참을 반환하면 render()를 호출해야 합니다.

참고: 이 신호가 방출될 때 바로 폴리싱, 동기화 및 렌더링을 트리거하지 마세요. 대신 타이머 등을 사용하여 지연시키는 것이 좋습니다. 이렇게 하면 성능이 향상됩니다.

[since 6.0] void QQuickRenderControl::setSamples(int sampleCount)

멀티샘플링에 사용할 샘플 수를 설정합니다. sampleCount 이 0 또는 1이면 멀티샘플링이 비활성화됩니다.

참고: 이 함수는 항상 멀티샘플 렌더 타겟과 함께 사용되므로 sampleCount 은 QQuickRenderTarget::fromNativeTexture()에 전달된 샘플 수와 일치해야 하며, 이는 다시 네이티브 텍스처의 샘플 수와 일치해야 함을 의미합니다.

이 함수는 Qt 6.0에 도입되었습니다.

samples(), initialize() 및 QQuickRenderTarget참조하십시오 .

bool QQuickRenderControl::sync()

이 함수는 QML 씬을 렌더링 씬 그래프와 동기화하는 데 사용됩니다.

전용 렌더 스레드를 사용하는 경우, 이 호출 기간 동안 GUI 스레드가 차단되어야 합니다.

동기화로 인해 씬 그래프가 변경되면 true를 반환합니다.

[since 6.0] QQuickWindow *QQuickRenderControl::window() const

QQuickRenderControl 이 연결된 QQuickWindow 을 반환합니다.

참고: QQuickRenderControlQQuickWindow 을 구성할 때 QQuickWindow 과 연결됩니다. 이 함수의 반환값은 그 이전에는 null입니다.

이 함수는 Qt 6.0에 도입되었습니다.

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