2013-02-21 72 views
6

मैं ओपन जीएल के साथ एक साधारण दृश्य चित्रित कर रहा हूं। मैंने QGLWidget और overriden paintGL() को उपclassed है। वहाँ कुछ भी नहीं फैंसी:स्क्रीन अपडेट करने के लिए QGLWidget को कैसे बाध्य करें?

void CGLWidget::paintGL() 
{ 
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    gluLookAt (120.0, 160.0, -300.0, 0.0 + 120.0, 0.0 + 160.0, 2.0 - 300.0, 0.0, 1.0, 0.0); 
    glScalef(1.0f/300.0f, 1.0f/300.0f, 1.0f/300.0f); 
    glClear(GL_DEPTH_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(80.0, width()/(double)height(), 5.0, 100000.0); 

    glMatrixMode(GL_MODELVIEW); 
    glBegin(GL_POINTS); 
    glColor3f(1.0f,0.6f,0.0f); 
    glVertex3d(x, y, z); 

    // ...drawing some more points... 

    glEnd(); 

} 

मैं मुख्य विंडो जो जीएल विजेट के updateGL() चलाता है में एक टाइमर है। मैंने सत्यापित किया है कि इसके परिणामस्वरूप paintGL() कहा जा रहा है। हालांकि, स्क्रीन पर वास्तविक तस्वीर केवल बहुत ही कम अद्यतन की जाती है। यहां तक ​​कि अगर मैं खिड़की का आकार बदलता हूं, तो दृश्य अपडेट नहीं होता है। वह क्यों है और मैं इसे अपडेट करने के लिए कैसे मजबूर कर सकता हूं?

+0

मैं पूछ सकते हैं: तुम क्यों 'paintGL' में दो बार प्रक्षेपण और एमवी मैट्रिक्स को प्रारंभ करते हैं? क्या आप बीच में कुछ खींचते हैं? यदि नहीं, तो आप दूसरे मैट्रिक्स को दूसरे के साथ ओवरराइट करते हैं और आप इस कोड को 'resizeGL' (प्रोजेक्शन) और' प्रारंभिक जीएल '(मॉडल-व्यू) – leemes

+0

@leemes में ले जा सकते हैं: कोई विचार नहीं, वास्तव में ... यह एक बग, अवशेष है वास्तव में काम करने वाले प्रक्षेपण और एमवी पैरामीटर खोजने की कोशिश कर रहा हूं। फिक्स्ड, धन्यवाद। –

उत्तर

10

अपने टाइमर से updateGL() को कॉल न करें, इसके बजाय यह सुनिश्चित करने के लिए कि दृश्य एक पेंट इवेंट हो।

+0

यह काम नहीं करता है, 'पेंटजीएल()' को तब भी नहीं कहा जाता है। दोनों को भी कॉल करने का प्रयास किया - यह भी काम नहीं करता है। लेकिन संकेत के लिए धन्यवाद। –

+0

QGLWidget :: paintEvent में ब्रेकपॉइंट चिपकाने का प्रयास करें और देखें कि यह अपडेट() को कॉल करने के बाद वहां जाता है और उसके बाद क्या होता है। – Pete

+0

यह केवल तब कहा जाता है जब मैं विंडो का आकार बदलता हूं। –

8

अपने CGLWidget निर्माता

QTimer *timer = new QTimer(this); 
connect(timer, SIGNAL(timeout()), this, SLOT(update())); 
timer->start(10); 

timer -> start(VALUE); 

खेलने अंदर `VALUE 10 के साथ सिर्फ एक उदाहरण है।

सजाना

+0

अरे, मैंने इस तकनीक का उपयोग किया है जो यह काम करता है। क्या किसी भी तरह से मैं दृश्य को तत्काल अद्यतन कर सकता हूं जैसे ही पिछले दृश्य प्रस्तुत किया जाता है क्योंकि अभी मेरे पास टाइमर से 10ms की बाधा है। मैं उससे ज्यादा तेज नहीं जा सकता। – activatedgeek

+0

'VALUE 10 के साथ खेलना सिर्फ एक उदाहरण है। यदि आप वहां 1 डालते हैं, तो यह 1 एमएमएस होगा, हालांकि, जब आप स्क्रीन रीफ्रेश करना चाहते हैं, तो बिंदु तब होता है जब आपका दृश्य तैयार होता है .. – Adorn

+0

बिल्कुल मैंने जो कहा। जैसे ही मेरा दृश्य तैयार हो जाता है, मैं अपडेट को ट्रिगर करना चाहता हूं। – activatedgeek