簡體   English   中英

QGraphicsPathItem 重疊的半透明路徑變得更加不透明

[英]QGraphicsPathItem overlapping semitransparent path become more opaque

我正在使用 QGraphicsPathItems 繪制半透明路徑,但是當兩條路徑重疊時出現問題,它們變得更加不透明,但我希望它們保持相同級別的透明度,無論有多少路徑重疊。

在左側兩條獨立的路徑,變得更加不透明。 右側,單條路徑自相交,透明度相同,這是我想通過多條路徑實現的效果。

重疊路徑

有可能實現這樣的目標嗎?

我搜索了一些關於 Qt 是否具有真正的不透明度分層,並在 Andreas Aardal Hanssen 的 Qt 博客中找到了一篇文章:

https://blog.qt.io/blog/2009/04/23/layered-rendering-part-2-it-helps-solve-many-problems/

他說唯一的方法是使用離屏渲染。

通過將“綠色子樹”渲染到一個單獨的層中,我們可以組合所有項目並應用一個統一的不透明度作為將這些項目組合在一起的一部分。 在我上一篇博客中,我寫了關於離屏渲染的文章。 這項工作取得了進展,處於相當可用的狀態(雖然代碼真的很丑)。 它有效! 與上述相同的應用程序的渲染輸出如下所示。

離屏渲染解決方案的鏈接是https://blog.qt.io/blog/2009/02/27/braindump-graphics-view-and-the-joys-of-off-screen-rendering

我認為這個想法是將每個圖層分別渲染為像素圖。 該層中的項目相對於彼此是不透明的。 然后,您以相對於彼此的透明度渲染圖層本身。

同一層中的項目相對於彼此是不透明的,但相對於其他層中的項目是透明的。

該鏈接討論了一些使用 DeepItemCoordinateCache 的原型項目,該項目將項目及其子項呈現到屏幕外緩沖區,然后呈現該緩沖區。 這樣就可以達到預期的效果。

將子樹折疊到單個屏幕外緩沖區是可能的。 我花了兩天時間在本周研究它,寫了一些代碼,並結束了一個原型,是如此的丑陋,我不希望只是還沒有分享。 😉 但我已經看到,在不弄亂 QGV 內部結構的情況下,這是完全可能的。 我配上了兩種新的緩存模式:

DeepItemCoordinateCache – 緩存項目和“所有”子項,如果父項被轉換,則不會為“任何”子項重新繪制 DeepDeviceCoordinateCache – 保存為 DeviceCoordinateCache

不幸的是,我不知道他的原型代碼是否在任何地方都可用。 他暗示它在https://doc.qt.io/qt-5/qtwidgets-graphicsview-embeddeddialogs-example.html的嵌入式對話框示例中,所以也許您應該在那里搜索。

很長一段時間后回到這個問題,我的最終解決方案確實使用 CompositionMode,確切地說是QPainter::CompositionMode_Multiply但我更糟糕的錯誤是我在使用的顏色中有 alpha。 使用提到的 CompositionMode 並且顏色中沒有 alpha 我得到了我正在尋找的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM