Bir Qt uygulamasında OpenGL sahnesini oluşturan QGLWidget
var. QGLWidget
'un üstüne yerleştirilen başka saydam Qt widget'ları eklemek istiyorum. OpenGL çizim içeriği Qt'ın ressam sınıfları tarafından bilinmediğinden, bu standart widget'lardan daha zordur. Öyleyse, sadece açık olanı yaparsam ve örneğin QGLWidget
'un üzerine şeffaf bir araç çubuğu yerleştirirsem, bunun yerine araç çubuğunun saydam kısmı siyah olur (boyama sırasında OpenGL çerçeve arabelleğine erişemez).Bir QWidget'i resimden nasıl önleyebilirim, ancak yine de olayları yanıtlayabilir miyim?
Böyle bir şeyle başa çıkmak için önerilen yol overpaint the 2D content after drawing the OpenGL scene. Bağlantılı örnek sadece basit şekiller çizdiğiniz sürece çok basit görünüyor. Bunun yerine yapmak istediğim, QGLWidget
için boya olayının içinde yapılacak bazı çocuk QWidget
nesnelerinin resmini ertelemek.
Yani, benim sorunum bu kadar aşağı kaynar:
- önle bindirme normal 2D bağlamda resimden
QWidget
s. QGLWidget
için boya olay işleyicisinde, arka planı oluşturan 3B sahneyi boyadıktan sonra bindirmeleri boyayın.
Bu listedeki ikinci öğe basit gibi görünüyor: Ben görünümün üstünde istenen widget çizmek için QGLWidget
'ın boya olayı içinde QWidget::render()
kullanabilirsiniz. Bu iyi çalışıyor.
İlk öğe daha zor: Olayların normal akışı sırasında widget'ların boyamasını önlemek için bir yönteme ihtiyacım var ve bunları yalnızca QGLWidget
'un boya işleyicisinde boyayorum. Bunu yapmanın açık bir yolu, QWidget::hide()
kullanarak kaplamaları gizlemektir. Bu, OpenGL sahnesinin üzerindeki widget'ları istediğim gibi boyamamı sağlıyor. Ancak, widget'lar gizlendiğinden, fare veya klavye olaylarına yanıt vermezler. Örnek olarak, üzerinde birkaç düğme bulunan QToolBar
kullanıyorum ve araç çubuğu düzgün şekilde boyanıyor, ancak işlevsel değil (düğmelerin hiçbiri tıklamalara yanıt vermiyor). Öyleyse, bu yoldan aşağı gidersek, widget'ı gizlenmiş olsa bile etkinliklere yanıt vermeye zorlamak için bir yönteme ihtiyacım var gibi görünüyor.
Denediğim başka bir yaklaşım, araç çubuğunun kendisini boyamasını önlemek amacıyla bir olay filtresi kullanarak QToolBar
'un boya olayını engellemektir. Ancak, araç çubuğu hala oluşturulmuştur; Bunun nedeni, araç çubuğundaki çeşitli düğmelerin, ana boya olayını etkilesem bile, hala boyanmış olan çocuk widget'ları olduğu varsayımıdır.
Amacımı gerçekleştirebilmem için herhangi bir fikir var mı?