QCanvasPainterWidget Class
QCanvasPainterWidget ist ein Widget zur Darstellung mithilfe von „ QCanvasPainter “. Mehr...
| Kopfzeile: | #include <QCanvasPainterWidget> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS CanvasPainter) target_link_libraries(mytarget PRIVATE Qt6::CanvasPainter) |
| Seit: | Qt 6.11 |
| Erbt von: | QRhiWidget |
Öffentliche Funktionen
| QCanvasPainterWidget(QWidget *parent = nullptr) | |
| virtual | ~QCanvasPainterWidget() override |
| QColor | fillColor() const |
| void | grabCanvas(const QCanvasOffscreenCanvas &canvas, const QObject *context, Functor &&callback) |
| bool | hasSharedPainter() const |
| void | setFillColor(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) |
Neu implementierte geschützte Funktionen
| virtual bool | event(QEvent *event) override |
| 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 die Darstellung mithilfe eines „ 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 zu den Member-Funktionen
[explicit] QCanvasPainterWidget::QCanvasPainterWidget(QWidget *parent = nullptr)
Erstellt ein `QCanvasPainterWidget` mit dem angegebenen ` parent`.
[override virtual noexcept] QCanvasPainterWidget::~QCanvasPainterWidget()
Zerstört die „ QCanvasPainterWidget “.
[protected] void QCanvasPainterWidget::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 ein entsprechender Aufruf von ` endCanvasPainting()` folgen, bevor aus ` prePaint()` zurückkehrt.
Der folgende Ausschnitt aus einer Unterklasse von ` QCanvasPainterWidget ` zeigt, wie eine Offscreen-Canvas gerendert und anschließend beim Zeichnen des Inhalts für das Widget als Bild oder Bildmuster verwendet werden kann:
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()
Gibt das Ende des Zeichnungsvorgangs auf der in ` beginCanvasPainting()` angegebenen Leinwand an.
Hinweis: Diese Funktion sollte nur aus ` prePaint()` aufgerufen werden.
beginCanvasPaintingAuf () muss immer der entsprechende Aufruf von endCanvasPainting() folgen, bevor aus prePaint() zurückkehrt.
[override virtual protected] bool QCanvasPainterWidget::event(QEvent *event)
Implementiert: ` QRhiWidget::event(QEvent *e)`.
QColor QCanvasPainterWidget::fillColor() const
Gibt die aktuelle Füllfarbe zurück.
Siehe auch „ setFillColor()“.
template <typename Functor> void QCanvasPainterWidget::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 aktuellen (Haupt-/GUI-)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 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 nicht im Bildschirmbereich angezeigten Leinwand in einer PNG-Datei speichern:
grabCanvas(m_offscreenCanvas, this, [](const QImage &image) {
image.save("result.png");
});[virtual protected] void QCanvasPainterWidget::graphicsResourcesInvalidated()
Wird aufgerufen, wenn zugrunde liegende Grafikressourcen, wie beispielsweise Texturen, verloren gehen.
Dies weist darauf hin, dass die von `addImage()` zurückgegebenen ` QCanvasImage `-Objekte nicht mehr gültig sind und `addImage()` erneut aufgerufen werden muss. Wenn die Implementierung von ` paint()` so gestaltet ist, dass dies keine Rolle spielt – beispielsweise weil keine Bilder verwendet werden oder `addImage()` immer aufgerufen wird –, sind keine Maßnahmen erforderlich. Andernfalls wird empfohlen, ein Flag oder Ähnliches 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 „canvases“ erstellen und deren Inhalte neu zeichnen.
Grafikressourcen können beispielsweise verloren gehen, wenn das Widget in ein neues Fenster der obersten Ebene verschoben wird, da dies bedeutet, dass es einer neuen QRhi -Instanz zugeordnet wird.
Siehe auch QRhiWidget::releaseResources().
bool QCanvasPainterWidget::hasSharedPainter() const
Gibt „ true “ zurück, wenn dieses Widget einen gemeinsam genutzten Painter verwendet.
Siehe auch „ setSharedPainter “.
[override virtual protected] void QCanvasPainterWidget::initialize(QRhiCommandBuffer *cb)
Implementiert: ` QRhiWidget::initialize` (`QRhiCommandBuffer *cb`).
[virtual protected] void QCanvasPainterWidget::initializeResources(QCanvasPainter *painter)
Implementieren Sie diese Methode neu, um Ressourcen mithilfe von ` painter` zu initialisieren. In der Regel wird diese Methode einmal vor dem ersten Aufruf von ` prePaint()` und ` paint()` aufgerufen. Eine Ausnahme bildet der Fall, dass 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)
Implementieren Sie diese Methode neu, um mit ` painter` zu zeichnen.
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-Canvases mithilfe von ` painter` durchzuführen.
Die Standardimplementierung ist leer.
Siehe auch ` beginCanvasPainting()` und ` endCanvasPainting()`.
[override virtual protected] void QCanvasPainterWidget::releaseResources()
Implementiert: QRhiWidget::releaseResources().
[override virtual protected] void QCanvasPainterWidget::render(QRhiCommandBuffer *cb)
Implementiert: ` QRhiWidget::render` (`QRhiCommandBuffer *cb`).
void QCanvasPainterWidget::setFillColor(QColor color)
Legen Sie die Füllfarbe auf „ color “ fest. Diese Farbe wird zum Zeichnen des Hintergrunds des Elements verwendet. Die Standardfarbe ist Schwarz.
Siehe auch ` fillColor()`.
void QCanvasPainterWidget::setSharedPainter(bool enable)
Deaktivieren Sie die gemeinsame Nutzung von „Painter“, wenn enable auf false verweist.
Wenn „Painter Sharing“ aktiviert ist, verwenden alle „ QCanvasPainterWidget “-Instanzen innerhalb desselben „ QWindow “ denselben „ QCanvasPainter “. Diese Funktion muss frühzeitig aufgerufen werden, z. B. im Konstruktor der abgeleiteten Klasse, und darf danach nicht mehr geändert werden.
Die gemeinsame Nutzung von „Paintern“ ist standardmäßig aktiviert.
Wenn zwei Widgets dedizierte, nicht gemeinsam genutzte Painter verwenden, sind die Grafikressourcen des jeweils anderen – wie beispielsweise die, die hinter „ QCanvasImage “ oder „QOffscreenCanvas“ stehen – für sie nicht sichtbar. Befinden sich die Widgets hingegen im selben Fenster und ist die gemeinsame Nutzung aktiviert, können sie Bilder oder Leinwände verwenden, die vom anderen Widget erstellt wurden, da beide denselben ` QCanvasPainter` nutzen.
Hinweis: Selbst wenn enable auf „true“ gesetzt ist, werden „Painters“ nicht zwischen Widgets geteilt, die zu unterschiedlichen Fenstern gehören (Top-Level-Widgets).
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.