2013-04-25 82 views
1

我有一个相当不真实的情况 - 我有一个带有子部件的小部件,我需要父母完成的绘画,绕过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属性,这会导致问题。所以现在的问题是如何避免它,同时迫使父母成为本地窗口?

回答

0

如果你想绕过油漆事件为您的孩子,您可以重新实现

virtual void paintEvent (QPaintEvent * event); 

他们。这样的:

.H

class QWidgetNoPaintEvent : public QWidget 
{ 
    //reimplement all ctors here 
    virtual void paintEvent (QPaintEvent * event); 
} 

的.cpp

void QWidgetNoPaintEvent::paintEvent (QPaintEvent * event) 
{ 
//do nothing, or reject event, or do something custom ??? 
} 

我不是100%肯定这是否会解决,虽然其他的问题,因为它只会通过Qt的阻挡油漆事件从QWidgetNoPaintEvent继承的小部件。

+0

这并不能解决问题,因为QWidget :: paintEvent()已经不做任何事情。 – krojew 2013-04-25 20:32:25