2017-01-03 3 views
1

QPコードを見ると、QPainterはQWidget::sharedPainter()(QPainterPrivate :: attachPainterPrivateを参照)を介して既存のQPainterインスタンスを再利用しようとしているようです。何らかの理由で、このsharedPainter()は1回のレンダーパスでのみ設定され、再びnullにリセットされます。QPainterはレンダリング呼び出しの間にキャッシュされるはずですか?

QPainterと関連するQPaintEngineの予想寿命はどれくらいですか?アプリケーションライフタイムごとに1回またはレンダリングコールごとに1回作成する必要がありますか?

QPaintEngine :: begin()についてはどうですか?レンダーパスごとに、またはエンジン作成ごとに1回呼び出す必要がありますか?

#if !defined(QT_OPENGL_ES_2) 
    QGLExtensionMatcher extensions; // <- calls glGetString for the extension strings 
    d->hasCompatibilityExtension = extensions.match("GL_ARB_compatibility"); 

    bool success = qt_resolve_version_2_0_functions(d->ctx) 
        && qt_resolve_buffer_extensions(d->ctx) 
        && (!QGLFramebufferObject::hasOpenGLFramebufferObjects() 
         || qt_resolve_framebufferobject_extensions(d->ctx)); 
    Q_ASSERT(success); 
    Q_UNUSED(success); 
#endif 

    d->shaderManager = new QGLEngineShaderManager(d->ctx); // Dirties the shader manager 

    glDisable(GL_STENCIL_TEST); 
    glDisable(GL_DEPTH_TEST); 
    glDisable(GL_SCISSOR_TEST); 

#if !defined(QT_OPENGL_ES_2) 
    glDisable(GL_MULTISAMPLE); 
#endif 

    d->glyphCacheType = QFontEngineGlyphCache::Raster_A8; 

#if !defined(QT_OPENGL_ES_2) 
#if defined(Q_WS_WIN) 
    if (qt_cleartype_enabled 
     && (fontSmoothingApproximately(1.0) || fontSmoothingApproximately(2.1))) 
#endif 
#if defined(Q_WS_MAC) 
    if (qt_applefontsmoothing_enabled) 
#endif 
     d->glyphCacheType = QFontEngineGlyphCache::Raster_RGBMask; 
#endif 

#if defined(QT_OPENGL_ES_2) 
    // OpenGL ES can't switch MSAA off, so if the gl paint device is 
    // multisampled, it's always multisampled. 
    d->multisamplingAlwaysEnabled = d->device->format().sampleBuffers(); 
#else 
    d->multisamplingAlwaysEnabled = false; 
#endif 

    return true; 
} 

答えて

2

QPainterが使用時点で作成する必要があります。

QGLPaintEngineEx2からのコードを見てみると、いくつかの高価な初期化を含むことができます)(特にQPaintEngineが::始めているようです。キャッシュしたり、ペイントイベントを超えて永続させることは決して決してありません。そのQtは実装の詳細です。

+0

ありがとうございます。私はQT 4.8.7でバグレポートを提出しました。なぜなら、QT 4.8はこのように動作しないからです。https://bugreports.qt.io/browse/QTBUG-57880 –

+0

"使用時にQPainterを作成する必要があります。 " - これは 'QGraphicsStuff ...'では当てはまりません。そこには、各項目の塗りつぶし関数内の既存のペインタへのポインタがパラメータとして渡されます。 – dtech

+0

@ddriver明らかに、あなたのためにすでにペインターが作成されている場合は、それを使用してください。それ以外の場合は、自分で作成してください。 –

関連する問題