2011-03-02 158 views
6

在我的應用程序中,用戶可能會更改OpenGL格式的屬性(即雙緩衝,多重採樣,各種緩衝區的深度...)。如何在運行時更改現有QGLWidget的QGLFormat?

現在,我的應用程序中只有一個QGLWidget,並且如果用戶更改了任何內容,我會銷燬並重新創建該窗口小部件。

現在,我想有多個小部件。所以如果格式改變了,我需要銷燬/重新創建所有的小部件。由於小部件可以採用各種配置,因此銷燬/重新創建它們很困難。那麼有沒有辦法在運行時更改QGLWidget的格式?

另外,有沒有辦法用另一個替換一個小部件? (即摧毀一個小部件,並重新下單究竟在何處使用站)

回答

4

這可能工作:

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

編輯:您也可以直接撥打QGLWidget::setFormat,但它是obsoletemay not always work。我認爲重新創建小部件更爲安全。具體做法如下:將你的GL小部件放入一個只包含GL小部件的子佈局(任何種類 - 例如QVBoxLayout)。當您想用新的GL小部件替換它時,請刪除舊小部件,然後在該子部件中插入新的小部件。

+0

這不起作用!首先,'QGLWidget :: context()'返回一個'const QGLContext *',所以你不能在它上面使用'QGLContext :: setFormat'。其次,我嘗試使用'const_cast <>',但這個小部件變成空白。 – PierreBdR 2011-03-03 08:12:08

+0

@Pierre:你可以調用QGLWidget :: setFormat,但它是[廢棄](http://doc.qt.nokia.com/4.6/qglwidget-obsolete.html#setFormat)和[可能並不總是工作](http: //www.crossplatform.ru/node/241)。我認爲重新創建小部件更爲安全。具體做法如下:將你的GL小部件放入一個只包含GL小部件的子佈局(任何種類 - 例如QVBoxLayout)。當你想用一個新的GL部件替換它時,'刪除'舊部件,並在你的子佈局中插入你的新部件。 – 2011-03-03 12:00:56

+0

mmmhh ...這是一個好主意!請編輯你的主要答案,我可以接受它。 – PierreBdR 2011-03-03 17:22:39