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;
}
ありがとうございます。私はQT 4.8.7でバグレポートを提出しました。なぜなら、QT 4.8はこのように動作しないからです。https://bugreports.qt.io/browse/QTBUG-57880 –
"使用時にQPainterを作成する必要があります。 " - これは 'QGraphicsStuff ...'では当てはまりません。そこには、各項目の塗りつぶし関数内の既存のペインタへのポインタがパラメータとして渡されます。 – dtech
@ddriver明らかに、あなたのためにすでにペインターが作成されている場合は、それを使用してください。それ以外の場合は、自分で作成してください。 –