将我的Qt 5.3.2依赖项升级到Qt 5.6后,VTK渲染不再起作用了。
这是5.3.2代码:
#include <QtWidgets>
#include <QGLWidget>
#include <vtkActor.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderer.h>
#include <vtkSphereSource.h>
#include <QVTKWidget.h>
#include <vtkRenderWindow.h>
int main( int argc, char** argv ){
// create QApplication
QApplication l_app( argc, argv );
// Create widget and layout
QWidget* l_main_widget = new QWidget;
QHBoxLayout* l_main_layout = new QHBoxLayout;
l_main_widget->setLayout( l_main_layout );
// create a QVtkWidget with a simple sphere inside
QVTKWidget* l_view = new QVTKWidget;
l_view->setFixedSize( 300, 300 );
vtkSmartPointer<vtkSphereSource> l_sphere_source = vtkSmartPointer<vtkSphereSource>::New();
vtkSmartPointer<vtkPolyDataMapper> l_sphere_mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
l_sphere_mapper->SetInputConnection( l_sphere_source->GetOutputPort() );
vtkSmartPointer<vtkActor> l_sphere_actor = vtkSmartPointer<vtkActor>::New();
l_sphere_actor->SetMapper( l_sphere_mapper );
vtkSmartPointer<vtkRenderer> l_renderer = vtkSmartPointer<vtkRenderer>::New();
l_renderer->AddActor( l_sphere_actor );
l_view->GetRenderWindow()->AddRenderer( l_renderer );
l_main_layout->addWidget( l_view );
// create a QWebEngineView
QGLWidget* l_gl_widget = new QGLWidget;
l_main_layout->addWidget(l_gl_widget);
l_main_widget->show();
return l_app.exec();
}
我只是将QGLWidget更新为Qt 5.6的QOpenGLWidget:
QOpenGLWidget* l_gl_widget = new QOpenGLWidget;
现在,我的QVTKWidget只是渲染一个黑色图像(见帖子末尾)。 我已经踩到了this thread about making QVTKWidget inherits QOpenGLWidget,但由于QOpenGLWidget & compositing
我付不起我试图将QVTKWidget&amp;它的一些方法(PaintEvent&amp; co。)使用像vtkGenericOpenGLRenderWindow这样的东西来手动管理它的渲染,但是我要面对我仍在努力解决的奇怪问题,或者我对这些问题不够熟练。
特别是在处理QOpenGLContext&amp; QSurfaceFormat,似乎我不能让他们使用OpenGL 3.2(VTK 7 OpenGL2后端需要)。他们似乎陷入2.1版本。
我应该提一下,我在Windows上没有这个问题。
如果你有一些线索或帮助,我很乐意接受。
最后评论:在我的应用程序中使用的QWebEngine替换QWebKit后出现此问题,但从未与VTK视图同时显示。然而,只要我显示QWebEngineView,我的应用程序的所有VTK视图就会停止工作。
感谢您的时间:)
答案 0 :(得分:0)
QOpenGLWidget的手册页说......
&#34;注意:在请求OpenGL核心配置文件上下文时,在构造QApplication实例之前调用QSurfaceFormat :: setDefaultFormat()在某些平台(例如,macOS)上是必需的。这是为了确保上下文之间的资源共享保持正常,因为所有内部上下文都是使用正确的版本和配置文件创建的。&#34;
这可能是您问题的根源吗?
我意识到QGLWidget和QOpenGLWidget之间的区别在于QGL~在小部件中使用本机窗口,而QOpenGLWidget则不然。 QOpenGLWidget始终使用屏幕外渲染。我相信它会增强渲染性能。 VTK方面的一个缺点是,如果您尝试在QOpenGLWidget(我的意思是QVTKWidget?继承QOpenGLWidget)之前尝试绘制某些内容(任何vtk小部件),程序将崩溃。