QQuickRhiItem Class
Die Klasse „QQuickRhiItem“ ist eine plattformunabhängige Alternative zu „ QQuickFramebufferObject “, die nicht an OpenGL gebunden ist, sondern die Integration des Renderings mit den „ QRhi “-APIs und „ Qt Quick “ ermöglicht. Mehr...
| Header: | #include <QQuickRhiItem> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Quick) target_link_libraries(mytarget PRIVATE Qt6::Quick) |
| qmake: | QT += quick |
| Seit: | Qt 6.7 |
| Erbt von: | QQuickItem |
Öffentliche Typen
| enum class | TextureFormat { RGBA8, RGBA16F, RGBA32F, RGB10A2 } |
Eigenschaften
|
|
Öffentliche Funktionen
| QQuickRhiItem(QQuickItem *parent = nullptr) | |
| virtual | ~QQuickRhiItem() override |
| bool | alphaBlending() const |
| QQuickRhiItem::TextureFormat | colorBufferFormat() const |
| QSize | effectiveColorBufferSize() const |
| int | fixedColorBufferHeight() const |
| int | fixedColorBufferWidth() const |
| bool | isMirrorVerticallyEnabled() const |
| int | sampleCount() const |
| void | setAlphaBlending(bool enable) |
| void | setColorBufferFormat(QQuickRhiItem::TextureFormat format) |
| void | setFixedColorBufferHeight(int height) |
| void | setFixedColorBufferWidth(int width) |
| void | setMirrorVertically(bool enable) |
| void | setSampleCount(int samples) |
Neu implementierte öffentliche Funktionen
| virtual bool | isTextureProvider() const override |
| virtual QSGTextureProvider * | textureProvider() const override |
Signale
| void | alphaBlendingChanged() |
| void | colorBufferFormatChanged() |
| void | effectiveColorBufferSizeChanged() |
| void | fixedColorBufferHeightChanged() |
| void | fixedColorBufferWidthChanged() |
| void | mirrorVerticallyChanged() |
| void | sampleCountChanged() |
Geschützte Funktionen
| virtual QQuickRhiItemRenderer * | createRenderer() = 0 |
| bool | isAutoRenderTargetEnabled() const |
| void | setAutoRenderTarget(bool enabled) |
Neu implementierte geschützte Funktionen
| virtual bool | event(QEvent *e) override |
| virtual void | geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) override |
| virtual void | releaseResources() override |
Ausführliche Beschreibung
QQuickRhiItem ist im Grunde das Pendant zu QRhiWidget in der Welt von „ Qt Quick “. Beide sind dafür vorgesehen, unterklassifiziert zu werden, und beide ermöglichen die Aufzeichnung von „ QRhi “-basiertem Rendering, das auf einen Offscreen-Farbpuffer abzielt. Das resultierende 2D-Bild wird dann mit dem Rest der „ Qt Quick “-Szene zusammengesetzt.
Hinweis: Während QQuickRhiItem eine öffentliche Qt-API ist, bieten die Klassen der „ QRhi “-Familie im Qt GUI-Modul, darunter QShader und QShaderDescription, nur begrenzte Kompatibilitätsgarantien. Für diese Klassen gibt es keine Garantien hinsichtlich der Quellcode- oder Binärkompatibilität, was bedeutet, dass die API nur mit der Qt-Version garantiert funktioniert, auf deren Grundlage die Anwendung entwickelt wurde. Änderungen, die zu einer Inkompatibilität auf Quellcodeebene führen, sollen jedoch auf ein Minimum beschränkt werden und werden nur in Minor-Releases (6.7, 6.8 usw.) vorgenommen. „ qquickrhiitem.h “ enthält keine direkten Header, die mit „ QRhi “ in Zusammenhang stehen. Um diese Klassen bei der Implementierung einer QQuickRhiItem-Unterklasse zu verwenden, verknüpfen Sie mit „ Qt::GuiPrivate “ (bei Verwendung von CMake) und binden Sie die entsprechenden Header mit dem Präfix „ rhi “ ein, zum Beispiel „ #include <rhi/qrhi.h> “.
QQuickRhiItem ist ein Ersatz für die veraltete Klasse „ QQuickFramebufferObject “. Letztere ist untrennbar mit OpenGL / OpenGL ES verbunden, während QQuickRhiItem mit den Klassen „ QRhi “ zusammenarbeitet, wodurch derselbe Rendering-Code mit Vulkan, Metal, Direct 3D 11/12 sowie OpenGL / OpenGL ES ausgeführt werden kann. Konzeptionell und funktional sind sie sich sehr ähnlich, und die Migration von „ QQuickFramebufferObject “ zu „QQuickRhiItem“ ist unkompliziert. „ QQuickFramebufferObject “ steht weiterhin zur Verfügung, um die Kompatibilität für bestehenden Anwendungscode zu gewährleisten, der direkt mit der OpenGL-API arbeitet.
Hinweis: QQuickRhiItem funktioniert nicht, wenn die „ software “-Anpassung des „ Qt Quick “-Szenengraphen verwendet wird.
Auf den meisten Plattformen erfolgt das Rendern des Szenengraphen und damit auch das von QQuickRhiItem durchgeführte Rendern in einem eigenen Thread. Aus diesem Grund erzwingt die Klasse QQuickRhiItem eine strikte Trennung zwischen der Item-Implementierung (der QQuickItem -Unterklasse) und der eigentlichen Renderlogik. Die gesamte Item-Logik, wie z. B. Eigenschaften und UI-bezogene Hilfsfunktionen, die für QML verfügbar sind, muss sich in der Unterklasse von `QQuickRhiItem` befinden. Alles, was mit dem Rendern zusammenhängt, muss sich in der Klasse ` QQuickRhiItemRenderer ` befinden. Um Race-Conditions und Lese-/Schreibprobleme durch zwei Threads zu vermeiden, ist es wichtig, dass der Renderer und das Item niemals gemeinsam genutzte Variablen lesen oder schreiben. Die Kommunikation zwischen dem Item und dem Renderer sollte in erster Linie über die Funktion `QQuickRhiItem::synchronize()` erfolgen. Diese Funktion wird im Render-Thread aufgerufen, während der GUI-Thread gesperrt ist. Die Verwendung von Queued-Verbindungen oder Ereignissen für die Kommunikation zwischen Item und Renderer ist ebenfalls möglich.
Anwendungen müssen sowohl von `QQuickRhiItem` als auch von ` QQuickRhiItemRenderer` ableiten. Die rein virtuelle Funktion ` createRenderer()` muss neu implementiert werden, um eine neue Instanz der Unterklasse ` QQuickRhiItemRenderer ` zurückzugeben.
Wie bei ` QRhiWidget` verwaltet `QQuickRhiItem` automatisch den Farbpuffer, bei dem es sich normalerweise um eine 2D-Textur (QRhiTexture) handelt oder um eine ` QRhiRenderBuffer `, wenn Multisampling verwendet wird. (Einige 3D-APIs unterscheiden zwischen Texturen und Renderbuffern, während bei anderen die zugrunde liegende native Ressource dieselbe ist; Renderbuffer werden hauptsächlich verwendet, um Multisampling mit OpenGL ES 3.0 zu ermöglichen.)
Die Größe der Textur passt sich standardmäßig an die Größe des Elements an (unter Berücksichtigung von ` device pixel ratio `). Ändert sich die Größe des Elements, wird die Textur mit der korrekten Größe neu erstellt. Wenn eine feste Größe bevorzugt wird, setzen Sie ` fixedColorBufferWidth ` und ` fixedColorBufferHeight ` auf Werte ungleich Null.
QQuickRhiItem ist ein „ texture provider “ und kann direkt in „ ShaderEffects “ und anderen Klassen verwendet werden, die Textur-Provider nutzen.
Obwohl dies kein primärer Anwendungsfall ist, ermöglicht QQuickRhiItem auch die Einbindung von Rendering-Code, der direkt eine 3D-Grafik-API wie Vulkan, Metal, Direct 3D oder OpenGL nutzt. Weitere Informationen zum Aufzeichnen nativer Befehle innerhalb eines „ QRhi “-Renderdurchlaufs finden Sie unter „ QRhiCommandBuffer::beginExternal “ (), und unter „ QRhiTexture::createFrom “ () erfahren Sie, wie Sie eine vorhandene native Textur verpacken und anschließend in einem nachfolgenden Renderdurchlauf mit „ QRhi “ verwenden können. Siehe auch QQuickGraphicsConfiguration bezüglich der Konfiguration der nativen 3D-API-Umgebung (z. B. Geräteerweiterungen) und beachten Sie, dass die ` QQuickWindow ` durch einen frühzeitigen Aufruf von ` QWindow::setVulkanInstance()` mit einer benutzerdefinierten ` QVulkanInstance ` verknüpft werden kann.
Hinweis: QQuickRhiItem verwendet immer dieselbe „ QRhi “-Instanz wie der „ QQuickWindow “ (und damit auch denselben OpenGL-Kontext, dasselbe Vulkan-Gerät usw.). Um festzulegen, welche zugrunde liegende 3D-Grafik-API verwendet wird, rufen Sie „ setGraphicsApi()“ frühzeitig auf dem „ QQuickWindow “ auf. Eine Änderung ist nach der Initialisierung des Szenengraphen nicht mehr möglich, und alle `QQuickRhiItem`-Instanzen in der Szene werden mit derselben 3D-API gerendert.
Ein einfaches Beispiel
Betrachten Sie die folgende Unterklasse von `QQuickRhiItem`. Sie wird hier in vollständiger Form gezeigt. Sie rendert ein einzelnes Dreieck mit perspektivischer Projektion, wobei das Dreieck basierend auf der Eigenschaft ` angle ` des benutzerdefinierten Elements gedreht wird. (Das bedeutet, dass es beispielsweise mit Animationen wie ` NumberAnimation ` aus QML gesteuert werden kann.)
class ExampleRhiItemRenderer : public QQuickRhiItemRenderer
{
public:
void initialize(QRhiCommandBuffer *cb) override;
void synchronize(QQuickRhiItem *item) override;
void render(QRhiCommandBuffer *cb) override;
private:
QRhi *m_rhi = nullptr;
std::unique_ptr<QRhiBuffer> m_vbuf;
std::unique_ptr<QRhiBuffer> m_ubuf;
std::unique_ptr<QRhiShaderResourceBindings> m_srb;
std::unique_ptr<QRhiGraphicsPipeline> m_pipeline;
QMatrix4x4 m_viewProjection;
float m_angle = 0.0f;
};
class ExampleRhiItem : public QQuickRhiItem
{
Q_OBJECT
QML_NAMED_ELEMENT(ExampleRhiItem)
Q_PROPERTY(float angle READ angle WRITE setAngle NOTIFY angleChanged)
public:
QQuickRhiItemRenderer *createRenderer() override;
float angle() const { return m_angle; }
void setAngle(float a);
signals:
void angleChanged();
private:
float m_angle = 0.0f;
};
QQuickRhiItemRenderer *ExampleRhiItem::createRenderer()
{
return new ExampleRhiItemRenderer;
}
void ExampleRhiItem::setAngle(float a)
{
if (m_angle == a)
return;
m_angle = a;
emit angleChanged();
update();
}
void ExampleRhiItemRenderer::synchronize(QQuickRhiItem *rhiItem)
{
ExampleRhiItem *item = static_cast<ExampleRhiItem *>(rhiItem);
if (item->angle() != m_angle)
m_angle = item->angle();
}
static QShader getShader(const QString &name)
{
QFile f(name);
return f.open(QIODevice::ReadOnly) ? QShader::fromSerialized(f.readAll()) : QShader();
}
static float vertexData[] = {
0.0f, 0.5f, 1.0f, 0.0f, 0.0f,
-0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
0.5f, -0.5f, 0.0f, 0.0f, 1.0f,
};
void ExampleRhiItemRenderer::initialize(QRhiCommandBuffer *cb)
{
if (m_rhi != rhi()) {
m_pipeline.reset();
m_rhi = rhi();
}
if (!m_pipeline) {
m_vbuf.reset(m_rhi->newBuffer(QRhiBuffer::Immutable, QRhiBuffer::VertexBuffer, sizeof(vertexData)));
m_vbuf->create();
m_ubuf.reset(m_rhi->newBuffer(QRhiBuffer::Dynamic, QRhiBuffer::UniformBuffer, 64));
m_ubuf->create();
m_srb.reset(m_rhi->newShaderResourceBindings());
m_srb->setBindings({
QRhiShaderResourceBinding::uniformBuffer(0, QRhiShaderResourceBinding::VertexStage, m_ubuf.get()),
});
m_srb->create();
m_pipeline.reset(m_rhi->newGraphicsPipeline());
m_pipeline->setShaderStages({
{ QRhiShaderStage::Vertex, getShader(QLatin1String(":/shaders/color.vert.qsb")) },
{ QRhiShaderStage::Fragment, getShader(QLatin1String(":/shaders/color.frag.qsb")) }
});
QRhiVertexInputLayout inputLayout;
inputLayout.setBindings({
{ 5 * sizeof(float) }
});
inputLayout.setAttributes({
{ 0, 0, QRhiVertexInputAttribute::Float2, 0 },
{ 0, 1, QRhiVertexInputAttribute::Float3, 2 * sizeof(float) }
});
m_pipeline->setVertexInputLayout(inputLayout);
m_pipeline->setShaderResourceBindings(m_srb.get());
m_pipeline->setRenderPassDescriptor(renderTarget()->renderPassDescriptor());
m_pipeline->create();
QRhiResourceUpdateBatch *resourceUpdates = m_rhi->nextResourceUpdateBatch();
resourceUpdates->uploadStaticBuffer(m_vbuf.get(), vertexData);
cb->resourceUpdate(resourceUpdates);
}
const QSize outputSize = renderTarget()->pixelSize();
m_viewProjection = m_rhi->clipSpaceCorrMatrix();
m_viewProjection.perspective(45.0f, outputSize.width() / (float) outputSize.height(), 0.01f, 1000.0f);
m_viewProjection.translate(0, 0, -4);
}
void ExampleRhiItemRenderer::render(QRhiCommandBuffer *cb)
{
QRhiResourceUpdateBatch *resourceUpdates = m_rhi->nextResourceUpdateBatch();
QMatrix4x4 modelViewProjection = m_viewProjection;
modelViewProjection.rotate(m_angle, 0, 1, 0);
resourceUpdates->updateDynamicBuffer(m_ubuf.get(), 0, 64, modelViewProjection.constData());
const QColor clearColor = QColor::fromRgbF(0.4f, 0.7f, 0.0f, 1.0f);
cb->beginPass(renderTarget(), clearColor, { 1.0f, 0 }, resourceUpdates);
cb->setGraphicsPipeline(m_pipeline.get());
const QSize outputSize = renderTarget()->pixelSize();
cb->setViewport(QRhiViewport(0, 0, outputSize.width(), outputSize.height()));
cb->setShaderResources();
const QRhiCommandBuffer::VertexInput vbufBinding(m_vbuf.get(), 0);
cb->setVertexInput(0, 1, &vbufBinding);
cb->draw(3);
cb->endPass();
}Bemerkenswert ist, dass diese einfache Klasse fast genau dem Code entspricht, der in der Einführung zu „ QRhiWidget “ gezeigt wird. Auch die Vertex- und Fragment-Shader sind identisch. Diese werden als GLSL-Quellcode im Vulkan-Stil bereitgestellt und müssen zunächst von der Qt-Shader-Infrastruktur verarbeitet werden. Dies geschieht entweder durch manuelles Ausführen des Befehlszeilentools „ qsb “ oder durch Verwendung der Funktion `qt_add_shaders()` in CMake. Das `QQuickRhiItem` lädt diese vorverarbeiteten ` .qsb `-Dateien, die im Lieferumfang der Anwendung enthalten sind. Weitere Informationen zur Shader-Übersetzungsinfrastruktur von Qt finden Sie unter Qt Shader Tools.
color.vert
#version 440
layout(location = 0) in vec4 position;
layout(location = 1) in vec3 color;
layout(location = 0) out vec3 v_color;
layout(std140, binding = 0) uniform buf {
mat4 mvp;
};
void main()
{
v_color = color;
gl_Position = mvp * position;
}color.frag
#version 440
layout(location = 0) in vec3 v_color;
layout(location = 0) out vec4 fragColor;
void main()
{
fragColor = vec4(v_color, 1.0);
}Sobald unser benutzerdefiniertes Element in QML verfügbar ist (beachten Sie die Datei „ QML_NAMED_ELEMENT “), kann es in jeder Szene instanziiert werden. (Nach dem Import der entsprechenden Datei „ URI “, die für „qt_add_qml_module()“ im CMake-Projekt angegeben wurde)
ExampleRhiItem {
anchors.fill: parent
anchors.margins: 10
NumberAnimation on angle { from: 0; to: 360; duration: 5000; loops: Animation.Infinite }
}Ein komplexeres Beispiel finden Sie unter „Szenengraph – RHI-Textur-Element “.
Siehe auch „ QQuickRhiItemRenderer“ , „Scene Graph – RHI Texture Item“, „ QRhi “ sowie „Scene Graph und Rendering“.
Dokumentation zu Mitgliedstypen
enum class QQuickRhiItem::TextureFormat
Legt das Format der Hintergrundtextur fest, auf die der „ QQuickRhiItem “ rendert.
| Konstante | Wert | Beschreibung |
|---|---|---|
QQuickRhiItem::TextureFormat::RGBA8 | 0 | Siehe „ QRhiTexture::RGBA8 “. Dies ist die Standardeinstellung. |
QQuickRhiItem::TextureFormat::RGBA16F | 1 | Siehe „ QRhiTexture::RGBA16F “. |
QQuickRhiItem::TextureFormat::RGBA32F | 2 | Siehe QRhiTexture::RGBA32F. |
QQuickRhiItem::TextureFormat::RGB10A2 | 3 | Siehe QRhiTexture::RGB10A2. |
Siehe auch QRhiTexture.
Dokumentation zu den Eigenschaften
alphaBlending : bool
Legt fest, ob beim Zeichnen des Quadrats, dessen Textur durch den Inhalt von „ QQuickRhiItem “ und dessen Renderer generiert wird, die Überblendung immer aktiviert ist.
Der Standardwert ist „ false “. Dies geschieht aus Leistungsgründen: Wenn keine Halbtransparenz vorliegt – da der „ QQuickRhiItemRenderer “ den Bildschirm auf eine undurchsichtige Farbe zurücksetzt und niemals Fragmente mit einem Alpha-Wert kleiner als 1 rendert –, macht es keinen Sinn, das Blending zu aktivieren.
Wenn die Unterklasse von ` QQuickRhiItemRenderer ` mit Halbtransparenz rendert, setzen Sie diese Eigenschaft auf `true`.
Hinweis: Unter bestimmten Bedingungen findet das Blending unabhängig vom Wert dieser Eigenschaft dennoch statt. Wenn beispielsweise der „ opacity “ des Elements (genauer gesagt die kombinierte Deckkraft, die von der übergeordneten Kette geerbt wurde) kleiner als 1 ist, wird das Blending automatisch aktiviert, selbst wenn diese Eigenschaft auf „false“ gesetzt ist.
Hinweis: Die „ Qt Quick “-Szenengrafik stützt sich auf und erwartet vormultipliziertes Alpha. Wenn beispielsweise beabsichtigt ist, den Hintergrund im Renderer auf einen Alpha-Wert von 0,5 zu löschen, müssen die roten, grünen und blauen Werte der Löschfarbe ebenfalls mit 0,5 multipliziert werden. Andernfalls sind die Ergebnisse der Überblendung fehlerhaft.
Zugriffsfunktionen:
| bool | alphaBlending() const |
| void | setAlphaBlending(bool enable) |
Notifier-Signal:
| void | alphaBlendingChanged() |
colorBufferFormat : TextureFormat
Diese Eigenschaft steuert das Texturformat für die als Farbpuffer verwendete Textur. Der Standardwert ist „ TextureFormat::RGBA8 “. „ QQuickRhiItem “ unterstützt das Rendern in eine Teilmenge der von „ QRhiTexture “ unterstützten Formate. Es sollten nur Formate angegeben werden, die von „ QRhi::isTextureFormatSupported()“ als unterstützt gemeldet werden; andernfalls funktioniert das Rendern nicht.
Hinweis: Die Festlegung eines neuen Formats, wenn das Element und sein Renderer bereits initialisiert sind und gerendert haben, bedeutet, dass alle vom Renderer erstellten QRhiGraphicsPipeline -Objekte unbrauchbar werden können, falls das zugehörige QRhiRenderPassDescriptor nun aufgrund des unterschiedlichen Texturformats inkompatibel ist. Ähnlich wie beim dynamischen Ändern von „ sampleCount “ bedeutet dies, dass die Implementierungen von `initialize()` oder `render()` sich dann um die Freigabe der bestehenden Pipelines und die Erstellung neuer Pipelines kümmern müssen.
Zugriffsfunktionen:
| QQuickRhiItem::TextureFormat | colorBufferFormat() const |
| void | setColorBufferFormat(QQuickRhiItem::TextureFormat format) |
Notifier-Signal:
| void | colorBufferFormatChanged() |
[read-only] effectiveColorBufferSize : QSize
Diese Eigenschaft gibt die Größe des zugrunde liegenden Farbpuffers ( QRhiTexture oder QRhiRenderBuffer) in Pixeln an. Sie ist für die Verwendung im GUI- (Haupt-)Thread, in QML-Bindungen oder in JavaScript vorgesehen.
Hinweis: Implementierungenvon ` QQuickRhiItemRenderer ` , die auf dem Render-Thread des Szenengraphen ausgeführt werden, sollten diese Eigenschaft nicht verwenden. Diese sollten die Größe stattdessen über ` render target` abfragen.
Hinweis: Der Wert wird aus Sicht des Haupt-Threads asynchron verfügbar, da sich der Wert ändert, wenn das Rendern im Render-Thread erfolgt. Das bedeutet, dass diese Eigenschaft vor allem in QML-Bindungen nützlich ist. Anwendungscode darf nicht davon ausgehen, dass der Wert bereits zum Zeitpunkt der Erstellung des „ QQuickRhiItem “-Objekts auf dem neuesten Stand ist.
Dies ist eine schreibgeschützte Eigenschaft.
Zugriffsfunktionen:
| QSize | effectiveColorBufferSize() const |
Notifier-Signal:
| void | effectiveColorBufferSizeChanged() |
fixedColorBufferHeight : int
Die feste Höhe der dem Objekt zugeordneten Textur in Pixeln. Relevant, wenn eine feste Texturgröße gewünscht wird, die nicht von der Größe des Objekts abhängt. Diese Größe hat keinen Einfluss auf die Geometrie des Objekts (seine Größe und Platzierung innerhalb der Szene), was bedeutet, dass der Inhalt der Textur auf die Fläche des Objekts gestreckt (vergrößert) oder verkleinert erscheint.
Standardmäßig lautet der Wert „ 0 “. Ein Wert von 0 bedeutet, dass sich die Größe der Textur nach der Größe des Objekts richtet. (texture size = item size * device pixel ratio).
Weitere Informationen zu den Anwendungsfällen für die Festlegung einer festen Breite und Höhe finden Sie unter fixedColorBufferWidth.
Zugriffsfunktionen:
| int | fixedColorBufferHeight() const |
| void | setFixedColorBufferHeight(int height) |
Notifier-Signal:
| void | fixedColorBufferHeightChanged() |
fixedColorBufferWidth : int
Die feste Breite (in Pixeln) der dem Element zugeordneten Textur oder des Renderbuffers. Relevant, wenn eine feste Farbpuffergröße gewünscht wird, die nicht von der Größe des Objekts abhängt. Diese Größe hat keinen Einfluss auf die Geometrie des Objekts (seine Größe und Platzierung innerhalb der Szene), was bedeutet, dass der Inhalt der Textur auf die Fläche des Objekts gestreckt (vergrößert) oder verkleinert erscheint.
Wird beispielsweise eine Größe festgelegt, die genau doppelt so groß ist wie die (Pixel-)Größe des Objekts, wird damit effektiv ein 2-faches Supersampling durchgeführt (Rendering mit doppelter Auflösung und anschließende implizite Verkleinerung beim Texturieren des dem Objekt in der Szene entsprechenden Quadrats). Stellt man hingegen eine Größe ein, die der Hälfte der Pixelgröße des Objekts entspricht, wird effektiv mit halber Auflösung gerendert und das Ergebnis anschließend hochskaliert.
Standardmäßig ist der Wert „ 0 “. Ein Wert von 0 bedeutet, dass die Größe der Textur der Größe des Elements folgt. (texture size = item size * device pixel ratio).
Hinweis: Das Gerätepixelverhältnis (der Skalierungsfaktor des System-Compositors) kann einen großen Einfluss auf die Leistung haben, da ein Skalierungsfaktor von 2 (200 %) bedeutet, dass mit doppelter Auflösung gerendert wird – also mit dem Doppelten dessen, was Entwickler und UI-Designer als Größe des Elements wahrnehmen – und der Inhalt anschließend effektiv herunterskaliert wird, ähnlich wie bei der Einstellung dieser Eigenschaft auf das Doppelte der Pixelgröße des Elements auf einem System, bei dem das Gerätepixelverhältnis 1 beträgt. Daher ist zu erwarten, dass diese Eigenschaft nur selten mit Größen verwendet wird, die größer sind als die Pixelgröße des Elements, da viele moderne Desktop-Systeme weder den Bedarf noch die Leistungsreserven dafür haben, wenn vom System ohnehin ein Gerätepixelverhältnis von mehr als 1 verwendet wird. Stattdessen besteht der Hauptanwendungsfall für diese Eigenschaft darin, eine kleinere Größe festzulegen, um mit einer angemessen geringeren Auflösung zu rendern, anstatt blind der Geometrie des Elements (und möglicherweise des Fensters) zu folgen, wie groß diese auch sein mag.
Zugriffsfunktionen:
| int | fixedColorBufferWidth() const |
| void | setFixedColorBufferWidth(int width) |
Benachrichtigungssignal:
| void | fixedColorBufferWidthChanged() |
mirrorVertically : bool
Diese Eigenschaft legt fest, ob die Textur-UVs beim Zeichnen des texturierten Vierecks gespiegelt werden. Sie hat keine Auswirkungen auf den Inhalt des Offscreen-Farbpuffers und die vom QQuickRhiItemRenderer implementierte Darstellung.
Der Standardwert ist „ false “.
Zugriffsfunktionen:
| bool | isMirrorVerticallyEnabled() const |
| void | setMirrorVertically(bool enable) |
Notifier-Signal:
| void | mirrorVerticallyChanged() |
sampleCount : int
Diese Eigenschaft steuert die Anzahl der Abtastungen für das Multisample-Antialiasing. Standardmäßig ist der Wert auf „ 1 “ gesetzt, was bedeutet, dass MSAA deaktiviert ist.
Gültige Werte sind 1, 4, 8 und manchmal 16 sowie 32. Mit „ QRhi::supportedSampleCounts()“ können die unterstützten Abtastanzahlen zur Laufzeit abgefragt werden, doch in der Regel sollten Anwendungen 1 (kein MSAA), 4x (normales MSAA) oder 8x (hohes MSAA) anfordern.
Hinweis: Die Festlegung eines neuen Werts bedeutet, dass alle vom Renderer erstellten „ QRhiGraphicsPipeline “-Objekte fortan dieselbe Sample-Anzahl verwenden müssen. Vorhandene „ QRhiGraphicsPipeline “-Objekte, die mit einer anderen Sample-Anzahl erstellt wurden, dürfen nicht mehr verwendet werden. Wenn sich der Wert ändert, werden alle Farb- und Tiefen-Stencil-Puffer automatisch zerstört und neu erstellt, und „ initialize()“ wird erneut aufgerufen. Wenn jedoch „ isAutoRenderTargetEnabled()“ auf „ false “ gesetzt ist, obliegt es der Anwendung, dies in Bezug auf den Tiefen-Stencil-Puffer oder zusätzliche Farbpuffer zu verwalten.
Das Ändern der Abtastanzahl vom Standardwert 1 auf einen höheren Wert bedeutet, dass ` colorTexture()` zu ` nullptr ` wird und ` msaaColorBuffer()` beginnt, ein gültiges Objekt zurückzugeben. Das Zurücksetzen auf 1 (oder 0) hat den umgekehrten Effekt: Beim nächsten Aufruf von `initialize()` gibt `msaaColorBuffer()` ` nullptr` zurück, während `colorTexture()` wieder gültig wird. Darüber hinaus gibt resolveTexture() immer dann ein gültiges (nicht-Multisample-) QRhiTexture zurück, wenn die Sample-Anzahl größer als 1 ist (d. h., MSAA wird verwendet).
Zugriffsfunktionen:
| int | sampleCount() const |
| void | setSampleCount(int samples) |
Benachrichtigungssignal:
| void | sampleCountChanged() |
Siehe auch „ QQuickRhiItemRenderer::msaaColorBuffer()“ und „ QQuickRhiItemRenderer::resolveTexture()“.
Dokumentation der Mitgliedsfunktionen
[explicit] QQuickRhiItem::QQuickRhiItem(QQuickItem *parent = nullptr)
Erstellt ein neues `QQuickRhiItem` mit dem angegebenen ` parent`.
[override virtual noexcept] QQuickRhiItem::~QQuickRhiItem()
Destruktor.
[pure virtual protected] QQuickRhiItemRenderer *QQuickRhiItem::createRenderer()
Implementieren Sie diese Funktion neu, um eine neue Instanz einer Unterklasse von ` QQuickRhiItemRenderer ` zu erstellen und zurückzugeben.
Diese Funktion wird im Rendering-Thread aufgerufen, während der GUI-Thread blockiert ist.
[override virtual protected] bool QQuickRhiItem::event(QEvent *e)
Implementiert: ` QQuickItem::event(QEvent *ev)`.
[override virtual protected] void QQuickRhiItem::geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry)
Implementiert: ` QQuickItem::geometryChange` (const QRectF &newGeometry, const QRectF &oldGeometry).
[protected] bool QQuickRhiItem::isAutoRenderTargetEnabled() const
Gibt die aktuelle Einstellung für die automatische Verwaltung von Depth-Stencil-Puffern und Renderzielen zurück.
Standardmäßig lautet dieser Wert „ true “.
Siehe auch ` setAutoRenderTarget()`.
[override virtual] bool QQuickRhiItem::isTextureProvider() const
Implementiert: ` QQuickItem::isTextureProvider()` const.
[override virtual protected] void QQuickRhiItem::releaseResources()
Implementiert: QQuickItem::releaseResources().
[protected] void QQuickRhiItem::setAutoRenderTarget(bool enabled)
Steuert, ob ein Tiefen-Stencil- QRhiRenderBuffer und ein QRhiTextureRenderTarget vom Element automatisch erstellt und verwaltet werden. Der Standardwert ist „ true “. Rufen Sie diese Funktion frühzeitig auf, beispielsweise im Konstruktor der abgeleiteten Klasse, und setzen Sie dabei „ enabled “ auf „ false “, um diese Funktion zu deaktivieren.
Im automatischen Modus richten sich die Größe und die Anzahl der Samples des Tiefen-Stencil-Puffers nach den Einstellungen der Farbpuffer-Textur. Im nicht-automatischen Modus geben renderTarget() und depthStencilBuffer() stets nullptr zurück, und es obliegt dann der Implementierung von initialize() in der Anwendung, sich um die Einrichtung und Verwaltung dieser Objekte zu kümmern.
[override virtual] QSGTextureProvider *QQuickRhiItem::textureProvider() const
Implementiert erneut: ` QQuickItem::textureProvider()` const.
© 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.