gpt4 book ai didi

c++ - 由他们的 parent 绘制 QWidgets

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:57:30 24 4
gpt4 key购买 nike

我有一个相当不正常的情况 - 我有一个带有子部件的部件,我需要绕过 Qt 5 绘制系统来由父部件完成子部件的绘制。详细说明:有一个具有 OpenGL 上下文的 QWidget,它在正常的 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。 children 也将 nullptr 作为 QPaintEngine 返回,但不设置除 Qt::WA_NoSystemBackground 和 Qt::WA_OpaquePaintEvent 之外的任何属性。简而言之 - 整个事情是一种让数百个小部件渲染到其父级拥有的一个 OpenGL 上下文的方法,以避免杀死具有许多上下文的系统。这种方法的问题是 children 都是黑人。有什么东西正在清除他们的可见区域,我不知道如何让这种黑暗消失。有人知道如何处理它吗?

编辑:

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

编辑 2:

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

最佳答案

如果你想为你的 child 绕过绘画事件,你可以重新实现

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 继承的小部件的绘制事件。

关于c++ - 由他们的 parent 绘制 QWidgets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16223263/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com