2011-12-30 17 views
5

Özel bir OpenGL sahnesini (QGLWidget'e sarılmış) uygulamaya çalışıyorum, ancak yine de QT denetimlerini (kaydırma çubukları ve düğmeleri gibi) kullanıyorum. Ana widget'ımın QWidget'i çocukken olan bir QGLWidget'i yapmaya çalıştım. Çocuk widget'ları işe yarıyor gibi görünüyor (açılan menüyü tıklattığımda, seçenekleri beliriyor), ancak widget çizilemiyor (beyaz bir kare görüyorum). QWIget'den QGLWidget'e kadar çocuk widget'larımın temel sınıfını değiştirdim ve QPainter işi çağırıyor, ancak QT GUI öğeleri hala görüntülenmiyor ...Grafikler için QGLWidget ve GUI için QT

Bazı QGLWidget'in QWidget'leri çocuklar olarak kullanamayacağını iddia ediyorum. Bundan emin değilim ve pes etmeye istekli değilim. Bu arada, OpenGL sahnesini çizmek için Görselleştirme Kitaplığı'nı kullanıyorum, ancak bu yalnızca bir OpenGL sarıcısıdır ...

Sorunun nerede olabileceği hakkında ipuçları var mı? Ayrıca, GQLWidget'e altwidget eklediğimde, temel olaylar bir nedenle işlenmeyi bırakıyor.

Güncelleme: Çeşitli parçacık ve düzen kombinasyonlarını denedim. QGLWidget sadece herhangi bir şeyin üstüne çizilir gibi görünüyor. Aletlerin Z-derinliğini ayarlamak için yükseltme() ile bile çalıştı, boşuna. Bir OpenGL widget'ının üzerine çizmenin tek yolu overlayGL() mi?

Güncelleştirme 2 Aylarca denedikten sonra, bunun QT ile ilgili bir şey olduğunu anladım. Bir QGLWidget, başka bir QGLWidget'in üzerine çizildiğinde, ilkinin background() işlevi çağrılmaz. Yani bir düğme var ve tıklanabilir, ancak çekilmez. Benim geçici çözümüm her şeyi QPainter kullanarak çizmekti - bu işe yarıyor. Merak ettiğim şey, bir tane çizmek için QPainter :: startNativePainting() kullanmak zorunda. Bir QGLWidget boyama aygıtı olduğu zaman startNativePainting() çağrısı yapmak için QPainter'da start() 'ı aşırı yükleyeceğini umarız ...

Başka bir (belki de kullanışlı) gerçek, QPainter'in Opengl içeriğini DEĞİŞTİRMESİ olarak adlandırmasıdır. Yani QPainter ile işbirliği içinde başka bir aracınız varsa (benim durumumda Görselleştirme Kitaplığı), olasılıklardan biri çökecektir (benim durumumda VL, her durumdan önce bağlam durumunun temizlenip temizlenmediğini kontrol eder).

+0

Ana pencere olarak bir GL olmayan pencere öğesi ve bir GL widget'ı çocukken oluşturamazsınız ? Bu nedenle, pencerenizde istediğiniz diğer kontroller çocuklardan ziyade GL penceresinin kardeşleri ve kuzenleri olacaktır. –

+0

İlk önce denedim - bazı GL_SRC_ALPHA sorunları hakkında şikayette bulunmuyor. QGLWidget, VL [link] (http://www.visualizationlibrary.org/) tarafından oluşturulmuştur ve çok karmaşıktır ve bu nedenle hata ayıklaması zor ... –

+0

QWidget türetilmiş nesnelere bir QGLWidget'in üstünden geçmeye çalışıyor musunuz? – cmannett85

cevap

2

biraz eski ve ben de tam ekran QGLWidget üstünden çizim ile bir sorun var 4.8

geliştirilmiş QGLWidget ile hiç denemedim Qt widgets using opengl render bir laboratuvar örneği yoktur - bu oldu NVidia'nın openGL sürücüsünde bir hata olduğu iddia edildi. Ben o zaman bir QGraphicsProxyWidget kullanarak Widget'larınızı çizebilirsiniz, bir QGraphicsScene için viewport olarak QGLWidget kullanmak yerinde olsaydım O https://bugreports.qt-project.org/browse/QTBUG-7556

0

Güncelleştirmeyi() açıkça çağırmayı denediniz mi? Bazen QGLWidget öğesinin görüntüleme türlerini yavaşlattığını buldum.

+0

Evet, QGLWidgets açıkça bildir(). Ben çizim siparişi doğru değil bir şeyden şüpheleniyorum, ama nasıl QT widget çizim ve nasıl etkilenebilir/nasıl etkilenmesi gerektiğini bilmiyorum ... –

+0

Küre veya bazı temel geometri çizmek için bazı basit opengl func kullanabilirsiniz demlik? Sadece QGLWidget öğesinin bazı şeyleri doğru şekilde çizeceğinden emin olmak için. Eğer çalışırsa, kullandığınız lib hakkında bazı hatalar var demektir. – NullSpace

+0

Sorun, openGL sahnesinin çizilmemesi değil. Sorun, normal QWidgets'ın ** üstüne ** çizilmesidir. –

1

çözüldüğünü görünmüyor. Böylelikle, widget'ları kolayca yerleştirme ve manipüle etme özelliğine sahip uygun bir OpenGL viewport'u elde edersiniz.

+0

Bunu da denedim, çalışır, ancak senaryonumla değil. QGLWidget'imi GGraphicsView'a (QGraphicsScene'imi veren) bir görünüm olarak verdim, ancak bir hatayla başarısız oluyor (aslında QGraphicsScene, GLContext'in boş olduğundan şikayet ediyor). Ben bunun QGLWidget özel bir içeriğe sahip olduğu gerçeği ile ilgili bir şey olduğunu düşünüyorum ... –

+0

Bu OpenGL desteği Qt gerektirir, sahip değilsiniz. QGLContext kodunuzu ve hangi OpenGL sürümünü çalıştırdığınızı kaydeder misiniz? – cmannett85

+0

'QGLContext * glctx = yeni QGLContext (context() -> biçim(), bu); QGLFormat fmt = context() -> format(); // fmt biçiminde çeşitli biçimli marametreler ayarlama glctx-> setFormat (fmt); glctx-> create (shareContext); setContext (glctx); ' –

0

Bu eski bir sorudur, ama son zamanlarda bu konuda sorun biraz vardı ve bu bana yardımcı budur -

Kullanım QML/QT Hızlı. QML, pencere öğesi öğelerinizi bir pencereye yerleştirmenize ve fare tıklamaları gibi olaylarda temel işlemleri yapmanıza olanak veren, javascript benzeri bir dildir. Diğer birkaç güzel özellik vardır, ancak bu soruyla en alakalı olanı, C++ kodundan qt widget'larını içe aktarabilmenizdir.Böylece, özel bir QGLWidget oluşturabilir, QML penceresine aktarabilir ve boyut/konum/çubuk widget'larını istediğiniz her şeyden çok kolay bir şekilde ayarlayabilirsiniz. QT'nin Scenegraph örneği bunu açıklayan harika bir iştir. Scenegraph'ın kodu da en az Qt Creator 3.2.1 Açık Kaynağında bir örnek olarak eklenmiştir (bu zaten sahip olduğum sürümdür)