2011-03-02 6 views
6

मेरे आवेदन में, उपयोगकर्ता ओपनजीएल प्रारूप (यानी डबल बफरिंग, मल्टीसाम्पलिंग, विभिन्न बफर की गहराई, ...) के गुणों को बदल सकता है।रनटाइम पर मौजूदा QGLWidget के लिए QGLFormat को कैसे बदला जाए?

अभी के लिए, मेरे आवेदन में केवल एक QGLWidget है, और यदि उपयोगकर्ता कुछ भी बदलता है, तो मैं विजेट को नष्ट और पुन: बना देता हूं।

अब, मुझे एक से अधिक विजेट चाहिए। तो यदि प्रारूप बदलता है, तो मुझे सभी विजेटों को नष्ट/पुन: बनाना होगा। चूंकि विजेट विभिन्न विन्यासों को ग्रहण कर सकता है, इसलिए उन्हें नष्ट करना/पुनर्निर्माण करना मुश्किल है। तो रनटाइम पर QGLWidget के प्रारूप को बदलने का कोई तरीका है?

वैकल्पिक रूप से, क्या किसी अन्य विजेट को प्रतिस्थापित करने का कोई तरीका है? (अर्थात एक विजेट को नष्ट करने और वास्तव में एक नया एक जगह है जहाँ यह खड़े करने के लिए उपयोग करें)

उत्तर

4

यह काम कर सकते हैं:

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

संपादित करें: तुम भी सीधे QGLWidget::setFormat कॉल कर सकते हैं, लेकिन यह obsolete और may not always work है। मुझे लगता है कि विजेट को फिर से बनाना सुरक्षित है। यहां बताया गया है: अपने जीएल विजेट को एक सब्बाउट (किसी भी प्रकार - जैसे QVBoxLayout) में रखें जिसमें आपके जीएल विजेट के अलावा कुछ भी नहीं है। जब आप इसे एक नए जीएल विजेट से बदलना चाहते हैं, तो पुराने को हटाएं, और उस नए संदेश को उस सब्बाउट में डालें।

+0

यह काम नहीं करता है! एक के लिए, 'QGLWidget :: संदर्भ() 'एक' कॉन्स QGLContext * 'देता है, इसलिए आप उस पर' QGLContext :: setFormat' का उपयोग नहीं कर सकते हैं। दूसरा, मैंने 'const_cast <>' का उपयोग करने की कोशिश की, लेकिन फिर विजेट खाली हो गया। – PierreBdR

+0

@Pierre: आप QGLWidget :: setFormat को कॉल कर सकते हैं, लेकिन यह [अप्रचलित] (http://doc.qt.nokia.com/4.6/qglwidget-obsolete.html#setFormat) और [हमेशा काम नहीं कर सकता] (http: //www.crossplatform.ru/node/241)। मुझे लगता है कि विजेट को फिर से बनाना सुरक्षित है। यहां बताया गया है: अपने जीएल विजेट को एक सब्बाउट (किसी भी प्रकार - जैसे QVBoxLayout) में रखें जिसमें आपके जीएल विजेट के अलावा कुछ भी नहीं है। जब आप इसे एक नए जीएल विजेट से बदलना चाहते हैं, तो पुराने को हटाएं, और उस नए विजेट को अपने सब्सआउट में डालें। –

+0

mmmhh ... यह एक अच्छा विचार है! कृपया, अपना मुख्य उत्तर संपादित करें कि मैं इसे स्वीकार कर सकता हूं। – PierreBdR

संबंधित मुद्दे