Auf dieser Seite

QCanvasPainterItemRenderer Class

Der `QCanvasPainterItemRenderer` übernimmt die gesamte Zeichnung für ein ` QCanvasPainterItem`. Mehr...

Überschrift: #include <QCanvasPainterItemRenderer>
CMake: find_package(Qt6 REQUIRED COMPONENTS CanvasPainter)
target_link_libraries(mytarget PRIVATE Qt6::CanvasPainter)
Seit: Qt 6.11
Erbt von: QQuickRhiItemRenderer

Öffentliche Funktionen

QCanvasPainterItemRenderer()
virtual ~QCanvasPainterItemRenderer() override
QColor fillColor() const
bool hasSharedPainter() const
qreal height() const
QCanvasPainter *painter() const
void setSharedPainter(bool enable)
qreal width() const

Geschützte Funktionen

void beginCanvasPainting(QCanvasOffscreenCanvas &canvas)
void endCanvasPainting()
void grabCanvas(const QCanvasOffscreenCanvas &canvas, const QObject *context, Functor &&callback)
virtual void initializeResources(QCanvasPainter *painter)
virtual void paint(QCanvasPainter *painter)
virtual void prePaint(QCanvasPainter *painter)
virtual void synchronizeData(QCanvasPainterItem *item)

Neu implementierte geschützte Funktionen

virtual void initialize(QRhiCommandBuffer *cb) override
virtual void render(QRhiCommandBuffer *cb) override
virtual void synchronize(QQuickRhiItem *item) override

Detaillierte Beschreibung

Implementieren Sie die Methode ` paint()` zur Durchführung der Darstellung.

Um Daten aus dem Element auf threadsichere Weise für den Renderer verfügbar zu machen, implementieren Sie ` synchronizeData()`.

Das Renderer-Objekt befindet sich im Render-Thread des Szenengraphen „Qt Quick “ und arbeitet dort, sofern ein solcher vorhanden ist, da dies der Thread ist, in dem „ createItemRenderer()“ und alle Funktionen dieser Klasse aufgerufen werden.

Wird der ` QCanvasPainterItem ` in einen anderen ` window` verschoben, wird er einem neuen ` QRhi` zugeordnet. Daher wird das Renderer-Objekt automatisch zerstört, und durch erneuten Aufruf von ` createItemRenderer()` wird ein neues erstellt. Dies ermöglicht eine einfache Verwaltung von „ QCanvasImage “- und „ QCanvasOffscreenCanvas “-Objekten, da diese als Membervariablen im Renderer entweder in „ initializeResources()“ oder in „ paint()“ eingerichtet werden können, ohne dass sie zurückgesetzt werden müssen, wenn die Grafikressourcen aufgrund einer Änderung von „window“ und „ QRhi “ verloren gehen, da dies alles implizit durch die Zerstörung des gesamten Renderer-Objekts geschieht.

Der folgende Codeausschnitt zeigt die typische Struktur einer Unterklasse von `QCanvasPainterItemRenderer`. Ein Beispiel für die Klasse ` MyItem ` finden Sie unter QCanvasPainterItem.

class MyRenderer : public QCanvasPainterItemRenderer
{
public:
    void synchronizeData(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_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;
};

Siehe auch QCanvasPainterItem.

Dokumentation zu den Member-Funktionen

QCanvasPainterItemRenderer::QCanvasPainterItemRenderer()

Erstellt ein `QCanvasPainterItemRenderer`.

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

Zerstört die „ QCanvasPainterItemRenderer “.

[protected] void QCanvasPainterItemRenderer::beginCanvasPainting(QCanvasOffscreenCanvas &canvas)

Beginnt mit der Aufzeichnung von „ QCanvasPainter “-Zeichenbefehlen, die auf „ canvas “ abzielen.

Hinweis: Diese Funktion sollte nur von ` prePaint()` aus aufgerufen werden.

Auf `beginCanvasPainting()` muss immer der entsprechende Aufruf von ` endCanvasPainting()` folgen, bevor die Funktion ` prePaint()` beendet wird.

[protected] void QCanvasPainterItemRenderer::endCanvasPainting()

Gibt das Ende des Zeichnungsvorgangs für die in ` beginCanvasPainting()` angegebene Leinwand an.

Hinweis: Diese Funktion sollte ausschließlich aus „ prePaint()“ aufgerufen werden.

beginCanvasPaintingAuf () muss immer der entsprechende Aufruf von endCanvasPainting() folgen, bevor aus prePaint() zurückgegeben wird.

QColor QCanvasPainterItemRenderer::fillColor() const

Gibt die aktuelle Füllfarbe des Elements zurück. Diese kann über die übergeordnete Klasse „ QCanvasPainterItem “ festgelegt werden.

[protected] template <typename Functor> void QCanvasPainterItemRenderer::grabCanvas(const QCanvasOffscreenCanvas &canvas, const QObject *context, Functor &&callback)

Gibt eine Anforderung zum Zurücklesen einer Textur für ` canvas` aus und ordnet diese ` context` zu.

callback wird im Render-Thread entweder vor der Rückgabe der Funktion oder später aufgerufen, je nach der zugrunde liegenden Implementierung von ` QRhi ` und der 3D-API. Das Zurücklesen von Texturinhalten kann je nach GPU-Architektur einen Kopiervorgang von der GPU zur CPU beinhalten. Die Funktion nimmt ein einzelnes ` const QImage & `-Argument entgegen und kann ein beliebiger Funktor sein, einschließlich solcher, die nur eine Verschiebung (move-only) zulassen.

Wird „ context “ zerstört, bevor das Zurücklesen abgeschlossen ist, wird der Grab-Vorgang abgebrochen und „ callback “ nicht aufgerufen. Dadurch ist es für den Callback sicher, auf Objekte zu verweisen, die möglicherweise nicht länger bestehen als das noch ausstehende Zurücklesen.

Beispielsweise würde der folgende Code den Inhalt einer Offscreen-Canvas in eine PNG-Datei speichern:

grabCanvas(offscreenCanvas, item, [](const QImage &image) {
    image.save("result.png");
});

bool QCanvasPainterItemRenderer::hasSharedPainter() const

Gibt „ true “ zurück, wenn dieser Element-Renderer einen gemeinsam genutzten Painter verwendet.

Siehe auch „ setSharedPainter “.

qreal QCanvasPainterItemRenderer::height() const

Gibt die Höhe des gezeichneten Bereichs in logischen Einheiten zurück, ohne den „ scale factor (device pixel ratio) “. Dieser Wert entspricht in der Regel dem Wert „ height “ des „painter“-Elements, es sei denn, „ QQuickRhiItem::fixedColorBufferHeight “ wurde gesetzt.

[override virtual protected] void QCanvasPainterItemRenderer::initialize(QRhiCommandBuffer *cb)

Implementiert: QQuickRhiItemRenderer::initialize(QRhiCommandBuffer *cb).

[virtual protected] void QCanvasPainterItemRenderer::initializeResources(QCanvasPainter *painter)

Implementieren Sie diese Methode neu, um Ressourcen mithilfe von ` painter` zu initialisieren. Diese Methode wird einmal vor dem ersten Aufruf von ` synchronizeData()` aufgerufen.

Hinweis: Diese Funktion wird nicht aufgerufen, wenn sich die Größe von ` QCanvasPainterItem ` ändert.

Siehe auch „ QCanvasPainter::addImage “ und „ QCanvasPainter::createCanvas “.

[virtual protected] void QCanvasPainterItemRenderer::paint(QCanvasPainter *painter)

Implementieren Sie diese Methode neu, um mit ` painter` zu zeichnen.

Diese Methode wird aufgerufen, nachdem das Element mit ` fillColor()` gefüllt wurde.

paint() wird vom Renderer-Thread aufgerufen. Um sicher auf die Elementdaten zugreifen zu können, kopieren Sie diese in synchronizeData().

Siehe auch ` synchronizeData()`.

QCanvasPainter *QCanvasPainterItemRenderer::painter() const

Gibt den an dieses Painter-Element angehängten Painter zurück.

[virtual protected] void QCanvasPainterItemRenderer::prePaint(QCanvasPainter *painter)

Diese Funktion wird zu Beginn des Renderings mit ` painter` aufgerufen, noch bevor ` paint()` ausgeführt wird.

Zum Zeitpunkt des Aufrufs dieser Funktion ist kein Renderziel aktiv. Rufen Sie ` beginCanvasPainting()` auf, um das Zeichnen in eine Offscreen-Canvas zu initialisieren.

Siehe auch ` beginCanvasPainting()` und ` endCanvasPainting()`.

[override virtual protected] void QCanvasPainterItemRenderer::render(QRhiCommandBuffer *cb)

Implementiert: ` QQuickRhiItemRenderer::render` (`QRhiCommandBuffer *cb`).

void QCanvasPainterItemRenderer::setSharedPainter(bool enable)

Deaktivieren Sie die gemeinsame Nutzung des Painters, wenn „ enable “ auf „ false “ gesetzt ist.

Die gemeinsame Nutzung von „Painter“ ist standardmäßig aktiviert.

Wenn „Painter Sharing“ aktiviert ist, verwenden alle „Painter“-Elemente innerhalb desselben „ QQuickWindow “ denselben „ QCanvasPainter “.

Wenn die gemeinsame Nutzung von „Painter“ deaktiviert werden soll, muss diese Funktion früh genug aufgerufen werden, beispielsweise im Konstruktor der abgeleiteten Klasse. Eine nachträgliche Änderung, wenn das Element bereits für das Zeichnen initialisiert wurde, hat keine Wirkung.

Wenn zwei Elemente eigene, nicht gemeinsam genutzte „Painters“ verwenden, sind die jeweiligen Grafikressourcen – wie beispielsweise die, die hinter „ QCanvasImage “ oder „QOffscreenCanvas“ stehen – für das jeweils andere Element nicht sichtbar. Befinden sich die Elemente hingegen im selben Fenster und ist die gemeinsame Nutzung aktiviert, können sie Bilder oder Leinwände verwenden, die vom anderen Element erstellt wurden, da beide denselben „ QCanvasPainter “ nutzen.

Hinweis: Selbst wenn enable auf „true“ gesetzt ist, werden Maler nicht zwischen Elementen geteilt, die zu unterschiedlichen „ QQuickWindow “-Instanzen und damit zu unterschiedlichen Szenengraphen gehören.

Siehe auch „ hasSharedPainter “.

[override virtual protected] void QCanvasPainterItemRenderer::synchronize(QQuickRhiItem *item)

Implementiert: ` QQuickRhiItemRenderer::synchronize` (`QQuickRhiItem *item`).

[virtual protected] void QCanvasPainterItemRenderer::synchronizeData(QCanvasPainterItem *item)

Implementieren Sie diese Methode neu, um die Daten zwischen den Instanzen von „ item “ und „item painter“ zu synchronisieren. Diese Methode wird jedes Mal vor dem Aufruf von „ paint()“ aufgerufen, wenn das Element neu gezeichnet werden muss.

Diese Methode ist der einzige Ort, an dem der Painter und das Item sicher die Variablen des jeweils anderen lesen und schreiben können.

In der Regel sollten Sie ` item ` mit `static_cast` in Ihren tatsächlichen Item-Typ umwandeln und anschließend die Daten austauschen.

qreal QCanvasPainterItemRenderer::width() const

Gibt die Breite des gezeichneten Bereichs in logischen Einheiten zurück, ohne den „ scale factor (device pixel ratio) “. Dieser Wert entspricht in der Regel dem „ width “ des „painter“-Elements, es sei denn, „ QQuickRhiItem::fixedColorBufferWidth “ wurde gesetzt.

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