由他们的父母绘制QWidgets

时间:2013-04-25 19:33:49

标签: c++ qt

我有一个相当不正常的情况 - 我有一个带有儿童小部件的小部件,我需要由父母完成孩子的绘画,绕过Qt 5绘画系统。详细说明:有一个QWidget有一个OpenGL上下文,它在普通的paintEvent()中绘制:

    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绘制管道。父窗口小部件设置了一些属性:

    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上下文的方法,以避免在多个上下文中杀死系统。 这种方法的问题是孩子都是黑人。有些东西正在清除它们的可见区域,我不知道如何使这种黑暗消失。有谁知道如何处理它?<​​/ p>

编辑:

使用setUpdatesEnabled(false);删除了黑色背景,但现在子窗口小部件的区域未更新。而是包含先前在屏幕上可见的内容。

编辑2:

我发现,如果父级具有Qt :: WA_PaintOnScreen属性,Qt会创建本机子窗口,这会导致问题。所以现在的问题是如何避免它,同时强迫父级成为本机窗口?

1 个答案:

答案 0 :(得分: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 ???
}

我不是百分之百确定它是否会解决其他问题,因为它只会通过Qt阻止从QWidgetNoPaintEvent继承的小部件的绘制事件。