2017-05-04 2 views
0

Kann ich ein Objekt gerendert machen, wenn ein Vorgänger davon eine Opazität 0 hat?Kann ich ein Objekt rendern lassen, wenn ein Vorgänger davon eine Opazität 0 hat?


Motivation

Die Motivation für diese Frage ist other question of mine (ich nenne es die "hidden-Textur-Quelle" Problem). Beachten Sie, dass ich derzeit opacity: 0 anstatt visible: false verwende, aber dies verursacht das gleiche Problem wie in der verknüpften Frage.

Der Grund, warum ich Objekte verstecke, ist this.

An einem Punkt habe ich nur jedes Element direkt aussortiert, das als Texturquelle verwendet werden muss. So ist die Lösung für das hidden-Textur-Source-Problem war einfach: (vereinfachte Pseudo-Code)

texSourceItem.opacity = 1; 
cppItem.update(); // QQuickFramebufferObject 
texSourceItem.opacity = 0; // reset back to 0 

Aber jetzt bin ich auch ganze s solcher Gegenstände Culling. Und da die Deckkraft vererbt wird, muss ich, wenn ich das cppItem aktualisieren möchte, den Tanz für den gesamten Elternteil ausblenden. . Dann können zwei texture-source-Elemente die hide-hide-Prozedur mit verzahntem Timing ausführen. Um Fehler zu vermeiden, muss ich einen benutzerdefinierten Referenzzähler behalten, der weiß, wie viele cppItems gerade aktualisiert werden. Dies ist eine zu komplizierte Lösung für meinen Geschmack. Eine Antwort auf meine Frage wäre also von Vorteil.

Antwort

0

Zitat aus dem documentation:

Wenn diese Eigenschaft gesetzt ist, wird die angegebene Opazität auch individuell auf das Kind Elemente angewendet. Dies kann unter bestimmten Umständen eine unbeabsichtigte Wirkung haben. Zum Beispiel hat das rote Rechteck in der zweiten Reihe der darunter liegenden Rechtecke eine Deckkraft von 0,5 angegeben, was sich auf die Deckkraft seines blauen untergeordneten Rechtecks ​​auswirkt, obwohl das Kind keine Deckkraft angegeben hat.

Aber Sie wussten wahrscheinlich, dass.

Ich weiß nicht genau verstehen, was genau Ihre Situation ist, aber die einzige Lösung, die ich sehen kann, wird die Item s zu machen, ist kein Nachkomme der transparenten Item sondern stattdessen es Geschwister.

Natürlich können Sie dann nicht an der Item s (grand) * Kind ankern, aber Sie können immer noch ihre Positionen zuordnen. (Seien Sie vorsichtig mit dem issue aber, dass mapTo/FromItem() könnte kompliziert sein zu aktualisieren, wenn sich die Position ändert)

Wenn wir diese Situation zum Beispiel haben:

Rectangle { 
    id: rect1 
    color: 'red' 
    anchors.fill: parent 

    Rectangle { 
     id: rect2 

     width: 200 
     height: 200 
     color: 'blue' 
     anchors.centerIn: parent 
     Rectangle { 
      id: rect3 
      width: 50 
      height: 50 
      color: 'green' 
      anchors.centerIn: parent 
     } 
    } 

    MouseArea { 
     anchors.fill: parent 
     onClicked: parent.opacity = !parent.opacity 
    } 
} 

Aber wir wollen halten rect2 machen wir dies tun können :

ShaderEffectSource { 
    sourceItem: rect2 
    sourceRect: Qt.rect(-rect2.x, -rect2.y, rect1.width, rect1.height) 
    anchors.fill: rect1 
} 

Für rect3 es unübersichtlich wird, da müssen wir jetzt den Überblick über die relative Position zu halten.(Um es dynamisch zu haben, siehe den Link vorher)

ShaderEffectSource { 
    sourceItem: rect3 
    sourceRect: Qt.rect(-rect2.x - rect3.x, -rect2.y - rect3.y, rect1.width, rect1.height) // keep track of all positions -.- 
    anchors.fill: rect1 
} 
+0

Re: die ShaderEffectSource Lösung: Haben Sie es versucht? Ich bin ziemlich sicher, dass, wenn 'rect'1'' opacity: 0' hat, die ShaderEffectSource es (oder seine Kinder) nicht als sourceItem verwenden kann. Nun, Sie erhalten keine Fehlermeldung/Absturz, aber nichts wird in der ShaderEffectSource gerendert. Re: das Element zu einem Geschwister machen: Das wird in meinem Fall nicht funktionieren, da ich die Opazitätsvererbung haben möchte, will ich nicht, dass sie während der Aktualisierung des cppItems angewendet wird. –

+0

Ich habe es versucht, funktioniert für mich wie gepostet. – derM

Verwandte Themen