2013-06-11 11 views
9

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:

  1. önle bindirme normal 2D bağlamda resimden QWidget s.
  2. 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ı?

cevap

12

Sorununuzu tamamen anlamıyorum, ancak başlıkta belirtilen soruyu yanıtlamaya çalışacağım. Etkinlik filtrelerini kullanmalısınız. widget, resmi engellemek istediğiniz bir pencere öğesi olan widget->installEventFilter(object) kullanarak bir olay filtresi yükleyin ve object, QObject türetilmiş sınıflarınızın herhangi birinin bir nesnesidir. Bu sınıfın eventFilter reimplement:

bool MyClass::eventFilter(QObject* object, QEvent* event) { 
    if (event->type() == QEvent::Paint) { return true; } 
    return false; 
} 

olay süzülür ve boya oluşmaz, senin eventfilter gelen gerçek döndüğünüzde.

Ayrıca, resmi geçici olarak devre dışı bırakmak için widget->setUpdatesEnabled(false) kullanmayı da deneyebilirsiniz. İşiniz bittiğinde yeniden etkinleştirmeyi unutmayın.