2011-03-02 18 views
6

Uygulamamda, kullanıcı OpenGL biçiminin özelliklerini değiştirebilir (örn. Çift arabelleğe alma, çoklu örnekleme, çeşitli arabelleklerin derinliği, ...).QGLFormat, çalışma zamanında var olan bir QGLWidget için nasıl değiştirilir?

Şimdilik, uygulamamda yalnızca bir tane QGLWidget var ve kullanıcı bir şeyi değiştirirse, aracı yok edip yeniden oluşturuyorum.

Şimdi, birden fazla küçük aracın olmasını istiyorum. Yani biçim değişirse, tüm widget'ları yok etmem/yeniden oluşturmam gerekiyor. Widget çeşitli konfigürasyonlar üstlenebileceğinden, bunları yok etmek/yeniden oluşturmak zordur. Yani çalışma zamanında bir QGLWidget biçimini değiştirmek için bir yolu var mı?

Alternatif olarak, bir widget'ı başka bir tane ile değiştirmenin bir yolu var mı? (Yani bir widget yok etmek ve onu durmak kullanmak tam olarak nerede yeni bir sipariş)

cevap

4

Bu işe yarayabilir:

QGLFormat newFormat; 
newFormat.setDoubleBuffer(true); 
// ... 
theGLWidget->context().setFormat(newFormat); 

Düzenleme: Ayrıca doğrudan QGLWidget::setFormat arayabilir, ancak obsolete ve may not always work bu. Widget'ı yeniden yaratmanın daha güvenli olduğunu düşünüyorum. İşte nasıl: GL parçacığınızı, GL widget'ınızdan başka hiçbir şey içermeyen bir alt diziye (örneğin, QVBoxLayout) yerleştirin. Yeni bir GL widget'ıyla değiştirmek istediğinizde, eski olanı silin ve yeni widget'ınızı bu alt diziye ekleyin.

+0

Bu işe yaramıyor! Bir, 'QGLWidget :: context()' 'const qGLContext *' döndürür, bu nedenle 'QGLContext :: setFormat' kullanamazsınız. İkincisi, 'const_cast <>' kullanmayı denedim, ancak widget boşlaşıyor. – PierreBdR

+0

@Pierre: QGLWidget :: setFormat'ı arayabilir, ancak [eski] (http://doc.qt.nokia.com/4.6/qglwidget-obsolete.html#setFormat) ve [her zaman çalışmayabilir] (http: //www.crossplatform.ru/node/241). Widget'ı yeniden yaratmanın daha güvenli olduğunu düşünüyorum. İşte nasıl: GL parçacığınızı, GL widget'ınızdan başka hiçbir şey içermeyen bir alt diziye (örneğin, QVBoxLayout) yerleştirin. Yeni bir GL widget'ıyla değiştirmek istediğinizde, eski olanı siler ve yeni widget'ınızı bu sublayout'a eklersiniz. –

+0

mmmhh ... bu iyi bir fikir! Lütfen, ana cevabınızı kabul edebileceğim şekilde düzenleyin. – PierreBdR

İlgili konular