Jas*_*n R 10 opengl qt paint qwidget
我有一个QGLWidget在Qt应用程序中呈现OpenGL场景.我想添加一些覆盖在其上的半透明Qt小部件QGLWidget.这比标准小部件更难,因为OpenGL绘图上下文对于Qt的画家类是未知的.因此,如果我只是做了明显的事情并在QGLWidget例如顶部放置一个透明工具栏,则工具栏的透明部分将呈现黑色(绘制时无法访问OpenGL帧缓冲区).
似乎处理此类事情的推荐方法是在绘制OpenGL场景后重绘2D内容.只要您只是绘制简单的形状,链接的示例似乎非常简单.相反,我想要做的是推迟绘制一些子QWidget对象的绘画,以便在绘画事件中完成QGLWidget.
所以,我的问题归结为:
QWidget在正常的2D上下文中绘制.QGLWidget绘制构成背景的3D场景后绘制叠加层.这个列表中的第二项似乎很简单:我可以QWidget::render()在QGLWidget绘图事件中使用在视口顶部绘制所需的小部件.这很好用.
第一项更棘手:我需要一种方法来阻止小部件在正常的事件过程中绘画,并且只在QGLWidget油漆处理程序中绘制它们.一个显而易见的方法是使用隐藏叠加层QWidget::hide().这允许我按照我的意愿在OpenGL场景上绘制小部件.但是,由于窗口小部件是隐藏的,因此它们不响应鼠标或键盘事件.作为一个例子,我使用了一个QToolBar带有几个按钮,工具栏被正确绘制,但是没有功能(没有一个按钮响应点击).因此,如果沿着这条路走下去,似乎我需要一种方法来强制小部件仍然响应事件,即使它是隐藏的.
我尝试过的另一种方法是QToolBar使用事件过滤器拦截绘制事件,目的是阻止工具栏自行绘制.但是,工具栏仍然呈现; 我假设这是因为工具栏上的各种按钮都是仍然绘制的子窗口小部件,即使我拦截了父级的绘制事件.
关于我可以实现目标的方式的任何想法?
Pav*_*hov 13
我完全不了解你的问题,但我会尝试回答标题中提到的问题.您应该使用事件过滤器.使用widget->installEventFilter(object),widget您要阻止绘制的窗口小部件安装事件过滤器,并且object是任何QObject派生类的对象.重新实现eventFilter这个类:
bool MyClass::eventFilter(QObject* object, QEvent* event) {
if (event->type() == QEvent::Paint) { return true; }
return false;
}
Run Code Online (Sandbox Code Playgroud)
从eventFilter返回true时,将过滤事件并且不会发生绘制.
您也可以尝试使用widget->setUpdatesEnabled(false)暂时禁用绘画.完成后别忘了重新启用它.