QCanvasPainterWidget Class
QCanvasPainterWidget ist ein Widget zum Rendern mit QCanvasPainter. Mehr...
| Kopfzeile: | #include <QCanvasPainterWidget> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS CanvasPainter)target_link_libraries(mytarget PRIVATE Qt6::CanvasPainter) |
| Seit: | Qt 6.11 |
| Erbt: | QRhiWidget |
| Status: | Technische Vorschau |
Öffentliche Funktionen
| QCanvasPainterWidget(QWidget *parent = nullptr) | |
| virtual | ~QCanvasPainterWidget() override |
| QColor | fillColor() const |
| void | grabCanvas(const QCanvasOffscreenCanvas &canvas, std::function<void (const QImage &)> callback) |
| bool | hasSharedPainter() const |
| void | setFillColor(const QColor &color) |
| void | setSharedPainter(bool enable) |
Geschützte Funktionen
| void | beginCanvasPainting(QCanvasOffscreenCanvas &canvas) |
| void | endCanvasPainting() |
| virtual void | graphicsResourcesInvalidated() |
| virtual void | initializeResources(QCanvasPainter *painter) |
| virtual void | paint(QCanvasPainter *painter) |
| virtual void | prePaint(QCanvasPainter *painter) |
Reimplementierte geschützte Funktionen
| virtual void | initialize(QRhiCommandBuffer *cb) override |
| virtual void | releaseResources() override |
| virtual void | render(QRhiCommandBuffer *cb) override |
Ausführliche Beschreibung
Implementieren Sie die virtuelle Funktion paint in einer Unterklasse, um das Rendering mit QCanvasPainter durchzuführen.
Der folgende Codeausschnitt zeigt die typische Struktur einer QCanvasPainterWidget-Unterklasse:
class MyWidget : public QCanvasPainterWidget { public: void initializeResources(QCanvasPainter *p) override { // load assets if (m_image.isNull()) m_image = p->addImage(QImage("image.png"), QCanvasPainter::ImageFlag::Repeat); } void paint(QCanvasPainter *p) override { // ... draw using m_image } void graphicsResourcesInvalidated() override { // textures are lost, indicate the need for reload m_image = {}; } QCanvasImage m_image; };
Dokumentation der Mitgliedsfunktionen
[explicit] QCanvasPainterWidget::QCanvasPainterWidget(QWidget *parent = nullptr)
Konstruiert ein QCanvasPainterWidget mit der angegebenen parent.
[override virtual noexcept] QCanvasPainterWidget::~QCanvasPainterWidget()
Zerstört die QCanvasPainterWidget.
[protected] void QCanvasPainterWidget::beginCanvasPainting(QCanvasOffscreenCanvas &canvas)
Startet die Aufzeichnung von QCanvasPainter Zeichenbefehlen mit dem Ziel canvas.
Hinweis: Diese Funktion sollte nur von prePaint() aus aufgerufen werden.
beginCanvasPainting() muss immer von der entsprechenden endCanvasPainting() gefolgt werden, bevor sie von prePaint() zurückkehrt.
Der folgende Ausschnitt aus einer QCanvasPainterWidget Unterklasse zeigt, wie ein Offscreen-Canvas gerendert und dann als Bild oder Bildmuster beim Zeichnen des Inhalts für das Widget verwendet werden könnte:
class MyWidget : public QCanvasPainterWidget { public: QCanvasOffscreenCanvas canvas; QCanvasImage canvasImage; void graphicsResourcesInvalidated() override { canvas = {}; // so that the next prePaint() will recreate and redraw the canvas } void prePaint(QCanvasPainter *p) override { if (canvas.isNull()) { canvas = p->createCanvas(QSize(320, 240)); beginCanvasPainting(canvas); p->beginPath(); p->circle(160, 120, 20); p->setFillStyle(Qt::red); p->fill(); endCanvasPainting(); canvasImage = p->addImage(canvas, QCanvasPainter::ImageFlag::Repeat); } } void paint(QCanvasPainter *p) override { // use canvasImage as a brush or with drawImage() } };
[protected] void QCanvasPainterWidget::endCanvasPainting()
Zeigt das Ende der Zeichnung an, die auf den in beginCanvasPainting() angegebenen Canvas abzielt.
Hinweis: Diese Funktion sollte nur von prePaint() aus aufgerufen werden.
beginCanvasPainting() muss immer von der entsprechenden Funktion endCanvasPainting() gefolgt werden, bevor sie von prePaint() zurückkehrt.
QColor QCanvasPainterWidget::fillColor() const
Gibt die aktuelle Füllfarbe zurück.
Siehe auch setFillColor().
void QCanvasPainterWidget::grabCanvas(const QCanvasOffscreenCanvas &canvas, std::function<void (const QImage &)> callback)
Stellt eine Texturrückleseanforderung für canvas.
callback wird entweder vor der Rückkehr der Funktion oder später aufgerufen, abhängig von der zugrunde liegenden QRhi und der 3D-API-Implementierung. Das Zurücklesen von Texturinhalten kann je nach GPU-Architektur eine GPU->CPU-Kopie beinhalten.
[virtual protected] void QCanvasPainterWidget::graphicsResourcesInvalidated()
Wird aufgerufen, wenn zugrundeliegende Grafikressourcen, wie z. B. Texturen, verloren gegangen sind.
Dies bedeutet, dass die von addImage() zurückgegebenen QCanvasImage Objekte nicht mehr gültig sind und addImage() erneut aufgerufen werden muss. Wenn die paint()-Implementierung so beschaffen ist, dass dies keine Rolle spielt, z. B. weil keine Bilder verwendet werden oder addImage() immer aufgerufen wird, dann ist keine Aktion erforderlich. Andernfalls ist es empfehlenswert, ein Flag o.ä. zu setzen und beim nächsten Aufruf von paint() entsprechend zu handeln.
Das Gleiche gilt für QCanvasOffscreenCanvas Objekte, die von QCanvasPainter::createCanvas() zurückgegeben werden. Wenn diese Funktion aufgerufen wird, sollte der nächste Aufruf von paint() neue Leinwände erzeugen und deren Inhalt neu zeichnen.
Grafikressourcen können verloren gehen, wenn das Widget z.B. in ein neues Top-Level-Fenster verschoben wird, da dies bedeutet, dass es mit einer neuen QRhi -Instanz verbunden ist.
Siehe auch QRhiWidget::releaseResources().
bool QCanvasPainterWidget::hasSharedPainter() const
Gibt true zurück, wenn dieses Widget einen gemeinsamen Painter verwendet.
Siehe auch setSharedPainter.
[override virtual protected] void QCanvasPainterWidget::initialize(QRhiCommandBuffer *cb)
Reimplements: QRhiWidget::initialize(QRhiCommandBuffer *cb).
[virtual protected] void QCanvasPainterWidget::initializeResources(QCanvasPainter *painter)
Reimplementieren Sie diese Methode, um Ressourcen mit painter zu initialisieren. Im Allgemeinen wird diese Methode einmal vor den ersten prePaint() und paint() aufgerufen. Eine Ausnahme ist, wenn die Grafikressourcen verloren gehen, siehe graphicsResourcesInvalidated(). In diesem Fall wird diese Methode anschließend erneut aufgerufen.
Die Standardimplementierung ist leer.
[virtual protected] void QCanvasPainterWidget::paint(QCanvasPainter *painter)
Reimplementieren Sie diese Methode, um mit painter zu malen.
Das Widget wird zunächst mit fillColor() gefüllt.
Die Standardimplementierung ist leer.
[virtual protected] void QCanvasPainterWidget::prePaint(QCanvasPainter *painter)
Implementieren Sie diese Funktion neu, um das Zeichnen in eine oder mehrere Offscreen-Leinwände mit painter durchzuführen.
Die Standardimplementierung ist leer.
Siehe auch beginCanvasPainting() und endCanvasPainting().
[override virtual protected] void QCanvasPainterWidget::releaseResources()
Reimplements: QRhiWidget::releaseResources().
[override virtual protected] void QCanvasPainterWidget::render(QRhiCommandBuffer *cb)
Reimplements: QRhiWidget::render(QRhiCommandBuffer *cb).
void QCanvasPainterWidget::setFillColor(const QColor &color)
Setzen Sie die Füllfarbe auf color. Diese Farbe wird verwendet, um den Hintergrund des Elements zu zeichnen. Die Standardfarbe ist Schwarz.
Siehe auch fillColor().
void QCanvasPainterWidget::setSharedPainter(bool enable)
Deaktivieren Sie die gemeinsame Nutzung von Malern, wenn enable false ist.
Wenn die gemeinsame Nutzung von Malern aktiviert ist, verwenden alle QCanvasPainterWidget Instanzen innerhalb derselben QWindow denselben QCanvasPainter. Diese Funktion muss frühzeitig, z. B. im Konstruktor der abgeleiteten Klasse, aktiviert werden und darf danach nicht mehr geändert werden.
Die gemeinsame Nutzung von Malern ist standardmäßig aktiviert.
Wenn zwei Widgets dedizierte, nicht gemeinsam genutzte Painter verwenden, sind die Grafikressourcen des jeweils anderen Widgets, wie z. B. die, die QCanvasImage oder QOffscreenCanvas unterstützen, für sie nicht sichtbar. Wenn sich die Widgets jedoch im selben Fenster befinden und die gemeinsame Nutzung aktiviert ist, können sie Bilder oder Leinwände verwenden, die vom anderen Widget erstellt wurden, da sie beide dieselbe QCanvasPainter verwenden.
Hinweis: Selbst wenn enable wahr ist, werden Maler nicht zwischen Widgets geteilt, die zu verschiedenen Fenstern gehören (Widgets der obersten Ebene).
Siehe auch hasSharedPainter.
© 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.