QCanvasPainterItemRenderer Class
QCanvasPainterItemRenderer는 QCanvasPainterItem...에 대한 모든 페인팅을 처리합니다... .
| 헤더: | #include <QCanvasPainterItemRenderer> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS CanvasPainter)target_link_libraries(mytarget PRIVATE Qt6::CanvasPainter) |
| 이후 | Qt 6.11 |
| 상속합니다: | QQuickRhiItemRenderer |
| Status: | 기술 미리보기 |
공용 함수
| QCanvasPainterItemRenderer() | |
| virtual | ~QCanvasPainterItemRenderer() override |
| QColor | fillColor() const |
| bool | hasSharedPainter() const |
| float | height() const |
| QCanvasPainter * | painter() const |
| void | setSharedPainter(bool enable) |
| float | width() const |
보호된 함수
| void | beginCanvasPainting(QCanvasOffscreenCanvas &canvas) |
| void | endCanvasPainting() |
| void | grabCanvas(const QCanvasOffscreenCanvas &canvas, std::function<void (const QImage &)> callback) |
| virtual void | initializeResources(QCanvasPainter *painter) |
| virtual void | paint(QCanvasPainter *painter) |
| virtual void | prePaint(QCanvasPainter *painter) |
| virtual void | synchronize(QCanvasPainterItem *item) |
재구현된 보호 함수
| virtual void | initialize(QRhiCommandBuffer *cb) override |
| virtual void | render(QRhiCommandBuffer *cb) override |
| virtual void | synchronize(QQuickRhiItem *item) override |
상세 설명
paint() 메서드를 구현하여 렌더링을 수행합니다.
항목의 데이터를 스레드 안전 방식으로 렌더러에 노출하려면 synchronize()를 구현합니다.
렌더러 객체는 createItemRenderer() 및 이 클래스의 모든 함수가 호출되는 스레드이므로 Qt Quick 씬 그래프 렌더 스레드가 있는 경우 이 스레드에 존재하고 작동합니다.
QCanvasPainterItem 가 다른 window 로 이동하면 새로운 QRhi 에 연결됩니다. 따라서 렌더러 객체는 자동으로 소멸되고 createItemRenderer()를 다시 호출하여 새 객체가 생성됩니다. 이렇게 하면 QCanvasImage 및 QCanvasOffscreenCanvas 객체는 렌더러의 멤버 변수가 될 수 있고 initializeResources() 또는 paint()에서 설정할 수 있으므로 창 및 QRhi 변경으로 인해 그래픽 리소스가 손실될 때 재설정할 필요 없이 전체 렌더러 객체의 파괴로 인해 암시적으로 발생하므로 간단하게 관리할 수 있습니다.
아래 코드 스니펫은 QCanvasPainterItemRenderer 서브클래스의 일반적인 구조를 보여줍니다. MyItem 클래스의 예는 QCanvasPainterItem 을 참조하세요.
class MyRenderer : public QCanvasPainterItemRenderer { public: void synchronize(QCanvasPainterItem *item) override { // copy a custom property value from item in a thread-safe manner m_value = static_cast<MyItem *>(item)->value(); } void initializeResources(QCanvasPainter *p) override { // load assets if (m_image.isNull()) m_image = p->addImage(QImage("image.png"), QCanvasPainter::ImageFlag::Repeat); } void prePaint(QCanvasPainter *p) override { // this is where offscreen canvases are drawn into if (m_canvas.isNull()) { m_canvas = p->createCanvas(QSize(640, 480)); beginCanvasPainting(m_canvas); // ... draw into the offscreen canvas endCanvasPainting(m_canvas); m_canvasImage = p->addImage(m_canvas); } } void paint(QCanvasPainter *p) override { QPointF center(width() / 2, height() / 2); // ... draw using m_value, m_image, and m_canvasImage } QCanvasImage m_image; QCanvasOffscreenCanvas m_canvas; QCanvasImage m_canvasImage; float m_value; };
QCanvasPainterItem도 참조하세요 .
멤버 함수 문서
QCanvasPainterItemRenderer::QCanvasPainterItemRenderer()
QCanvasPainterItemRenderer 를 생성합니다.
[override virtual noexcept] QCanvasPainterItemRenderer::~QCanvasPainterItemRenderer()
QCanvasPainterItemRenderer 를 파괴합니다.
[protected] void QCanvasPainterItemRenderer::beginCanvasPainting(QCanvasOffscreenCanvas &canvas)
canvas 을 대상으로 하는 QCanvasPainter draw 명령을 기록하기 시작합니다.
참고: 이 함수는 prePaint()에서만 호출해야 합니다.
prePaint()에서 반환하기 전에 시작 캔버스 페인팅() 뒤에 항상 해당 endCanvasPainting()이 와야 합니다.
[protected] void QCanvasPainterItemRenderer::endCanvasPainting()
beginCanvasPainting()에 지정된 캔버스를 대상으로 하는 드로잉의 끝을 나타냅니다.
참고: 이 함수는 prePaint()에서만 호출해야 합니다.
beginCanvasPainting() 뒤에는 항상 prePaint()에서 반환하기 전에 해당 endCanvasPainting()이 와야 합니다.
QColor QCanvasPainterItemRenderer::fillColor() const
항목의 현재 채우기 색상을 반환합니다. 이는 상위 QCanvasPainterItem 에서 설정할 수 있습니다.
[protected] void QCanvasPainterItemRenderer::grabCanvas(const QCanvasOffscreenCanvas &canvas, std::function<void (const QImage &)> callback)
canvas 에 대한 텍스처 읽기백 요청을 발행합니다.
callback 함수가 반환되기 전에 호출되거나, 기본 QRhi 및 3D API 구현에 따라 나중에 호출됩니다. 텍스처 콘텐츠를 다시 읽어오는 데는 GPU 아키텍처에 따라 GPU->CPU 복사본이 포함될 수 있습니다.
bool QCanvasPainterItemRenderer::hasSharedPainter() const
이 항목 렌더러가 공유 페인터를 사용하는 경우 true 를 반환합니다.
setSharedPainter 를참조하세요 .
float QCanvasPainterItemRenderer::height() const
scale factor (device pixel ratio) 없이 칠한 영역의 높이를 논리 단위로 반환합니다. 이는 일반적으로 QQuickRhiItem::fixedColorBufferHeight 이 설정되지 않은 경우 페인트 항목의 height 과 동일합니다.
[override virtual protected] void QCanvasPainterItemRenderer::initialize(QRhiCommandBuffer *cb)
다시 구현합니다: QQuickRhiItemRenderer::initialize(QRhiCommandBuffer *cb).
[virtual protected] void QCanvasPainterItemRenderer::initializeResources(QCanvasPainter *painter)
이 메서드를 다시 구현하여 painter 을 사용하여 리소스를 초기화합니다. 이 함수는 첫 번째 synchronize() 전에 한 번 호출됩니다.
참고: 이 함수는 QCanvasPainterItem 의 크기가 변경될 때는 호출되지 않습니다.
QCanvasPainter::addImage 및 QCanvasPainter::createCanvas 을참조하세요 .
[virtual protected] void QCanvasPainterItemRenderer::paint(QCanvasPainter *painter)
이 메서드를 다시 구현하여 painter 을 사용하여 페인트합니다.
이 메서드는 항목이 fillColor()로 채워진 후에 호출됩니다.
paint()는 렌더러 스레드에서 호출됩니다. 항목 데이터에 안전하게 액세스하려면 synchronize()에 복사하세요.
synchronize()도 참조하세요 .
QCanvasPainter *QCanvasPainterItemRenderer::painter() const
이 페인터 아이템에 첨부된 페인터를 반환합니다.
[virtual protected] void QCanvasPainterItemRenderer::prePaint(QCanvasPainter *painter)
이 함수는 paint() 앞에 painter 를 사용하여 렌더링을 시작할 때 호출됩니다.
이 함수가 호출될 때 활성화된 렌더링 타깃이 없습니다. beginCanvasPainting ()를 호출하여 오프스크린 캔버스에 그리기를 초기화합니다.
beginCanvasPainting() 및 endCanvasPainting()도 참조하세요 .
[override virtual protected] void QCanvasPainterItemRenderer::render(QRhiCommandBuffer *cb)
다시 구현합니다: QQuickRhiItemRenderer::render(QRhiCommandBuffer *cb).
void QCanvasPainterItemRenderer::setSharedPainter(bool enable)
enable 이 false 인 경우 페인터 공유를 비활성화합니다.
페인터 공유는 기본적으로 활성화되어 있습니다.
페인터 공유가 활성화되면 동일한 QQuickWindow 내의 모든 페인터 항목은 동일한 QCanvasPainter 을 사용합니다.
페인터 공유를 비활성화하려면 이 함수를 파생 클래스의 생성자 등에서 충분히 일찍 호출해야 합니다. 아이템이 이미 페인팅을 위해 초기화된 후에 이 함수를 변경하면 아무런 효과가 없습니다.
두 항목이 공유되지 않는 전용 페인터를 사용하는 경우 QCanvasImage 또는 QOffscreenCanvas를 뒷받침하는 것과 같은 서로의 그래픽 리소스가 표시되지 않습니다. 반면, 두 항목이 같은 창에 있고 공유가 활성화되어 있으면 둘 다 동일한 QCanvasPainter 을 사용하기 때문에 다른 항목에서 만든 이미지나 캔버스를 사용할 수 있습니다.
참고: enable 이 참인 경우에도 서로 다른 QQuickWindow 인스턴스에 속한 항목, 더 나아가 서로 다른 씬 그래프에 속하는 항목 간에는 페인터가 공유되지 않습니다.
hasSharedPainter도 참조하십시오 .
[virtual protected] void QCanvasPainterItemRenderer::synchronize(QCanvasPainterItem *item)
이 메서드를 다시 구현하여 item 와 아이템 페인터 인스턴스 간에 데이터를 동기화합니다. 이 메서드는 항목을 다시 칠해야 할 때마다 paint() 앞에 호출됩니다.
이 메서드는 페인터와 아이템이 서로 변수를 읽고 쓰는 것이 안전한 유일한 곳입니다.
일반적으로 item 을 실제 아이템 유형으로 정적_캐스트한 다음 데이터를 교환해야 합니다.
참고: QQuickRhiItem 을 받는 base class' version 대신 QCanvasPainterItem 을 받아 이 오버로드를 다시 구현해야 합니다.
[override virtual protected] void QCanvasPainterItemRenderer::synchronize(QQuickRhiItem *item)
다시 구현합니다: QQuickRhiItemRenderer::synchronize(QQuickRhiItem *항목).
float QCanvasPainterItemRenderer::width() const
scale factor (device pixel ratio) 없이 칠한 영역의 너비를 논리 단위로 반환합니다. 이는 일반적으로 QQuickRhiItem::fixedColorBufferWidth 이 설정되어 있지 않은 경우 페인트 항목의 width 과 동일합니다.
© 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.