我有一个相当不真实的情况 - 我有一个带有子部件的小部件,我需要父母完成的绘画,绕过Qt 5绘制系统。详细:存在具有OpenGL上下文一个QWidget和它其画在正常的paintEvent():由他们的父母绘制QWidgets
mRenderer->activate();
mRenderer->preRender();
mRenderer->setClearColor(Color(0.75f));
mRenderer->clear(Renderer::CLEAR_Color);
QList<RendererWidgetWrapper *> wrappers = findChildren<RendererWidgetWrapper *>();
foreach (RendererWidgetWrapper *wrapper, wrappers)
wrapper->paint();
mRenderer->postRender();
其中mRenderer为OpenGL中的包装物(或任何其他可能的3D渲染器)。请注意,它在其子节点上显式调用paint()。这个paint()函数只是使用mRenderer渲染一些东西,因此绕过了普通的Qt paint pipeline。父窗口小部件设置了一些属性:
setAttribute(Qt::WA_PaintOnScreen);
setAttribute(Qt::WA_NoSystemBackground);
setAttribute(Qt::WA_OpaquePaintEvent);
setAttribute(Qt::WA_PaintUnclipped);
并返回nullptr作为其QPaintEngine。孩子们也返回nullptr作为QPaintEngine,但不要设置除Qt :: WA_NoSystemBackground和Qt :: WA_OpaquePaintEvent之外的任何其他属性。简而言之 - 整个事情就是让数百个小部件渲染到其父级所拥有的一个OpenGL上下文中,以避免使用许多上下文来杀死系统。 这种方法的问题是孩子们都是黑人。有些东西正在清理它们的可见区域,我不知道如何使这种黑暗消失。有谁知道如何处理它?
编辑:
使用setUpdatesEnabled(假);删除黑色背景,但现在子部件的区域未更新。而是包含之前在屏幕上可见的内容。
编辑2:
我发现的Qt创建本地儿童的窗户,如果家长有Qt的:: WA_PaintOnScreen属性,这会导致问题。所以现在的问题是如何避免它,同时迫使父母成为本地窗口?
这并不能解决问题,因为QWidget :: paintEvent()已经不做任何事情。 – krojew 2013-04-25 20:32:25