刚接触VTK,最新的已经是9.0.3了,而且我经常用Qt开发,因此在学习时直接开始上手 QVTKOpenGLNativeWidget
参考这里的代码 https://blog.csdn.net/qq_37996632/article/details/106449316
#include <QtWidgets/QApplication>
#include <QSurfaceFormat>
#include <QVTKOpenGLNativeWidget.h>
#include <vtkSphereSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkGenericOpenGLRenderWindow.h>
#include <vtkNamedColors.h>
#include <vtkProperty.h>
#include <vtkSmartPointer.h>
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
VTK_MODULE_INIT(vtkRenderingFreeType);
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
QSurfaceFormat::setDefaultFormat(QVTKOpenGLNativeWidget::defaultFormat());
QVTKOpenGLNativeWidget *widget = new QVTKOpenGLNativeWidget();
vtkSmartPointer<vtkNamedColors> colors = vtkSmartPointer<vtkNamedColors>::New();
vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();
vtkSmartPointer<vtkPolyDataMapper> sphereMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
sphereMapper->SetInputConnection(sphereSource->GetOutputPort());
vtkSmartPointer<vtkActor> sphereActor = vtkSmartPointer<vtkActor>::New();
sphereActor->SetMapper(sphereMapper);
sphereActor->GetProperty()->SetColor(colors->GetColor4d("Tomato").GetData());
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(sphereActor);
renderer->SetBackground(colors->GetColor3d("SteelBlue").GetData());
vtkSmartPointer<vtkGenericOpenGLRenderWindow> renderWindow = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
renderWindow->AddRenderer(renderer);
renderWindow->SetWindowName("RenderWindowNoUIFile");
widget->SetRenderWindow(renderWindow);
widget->resize(800, 600);
widget->show();
return a.exec();
}
显示如下
问题1 ,widget->SetRenderWindow(renderWindow); 在VTK9中,SetRenderWindow第一个字母改成了小写,变为setRenderWindow
问题2,
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
VTK_MODULE_INIT(vtkRenderingFreeType);
这两句报错,直接注释掉,也可以编译。
问题3,运行报错QWidget: Must construct a QApplication before a QWidget, 思考很久也没想明白,后来发现切换为debug版没问题。想起来VTK的动态库后缀不一样,把debug版后的d去掉,再运行release版,没有问题。同样,如果debug版调试时,用的是release版的VTK动态库也报这个错误。
还有很多不太明白的地方,比如,程序支持鼠标交互,但是代码里面怎么操作的,没看懂。
各种颜色的设置,默认值有多少种,去哪里查,不太清楚。
对于为什么用QVTKOpenGLNativeWidget这个类,也是参考很多人的介绍。
1.Qt版本
在Qt5.4以前,在Qt中使用OpenGL一般是使用QGLWidget,相对应的VTK控件只能选择QVTKWidget/QVTKWidget2。其中QVTKWidget2是QVTKWidget的升级,不过也是十分古老了,这两个类都不建议使用。
而在Qt5.4及后面版本中,引入了QOpenGLWidget旨在代替老旧的QGLWidget,但是QGLWidget仍然是被保留的。对应的VTK控件为QVTKOpenGLWidget/QVTKOpenGLNativeWidget。
2.VTK版本(Qt版本为5.4之后的情况下)
在VTK8.2之前的版本,一般是使用QVTKOpenGLWidget;
在VTK8.2及之后的版本里,引入了QVTKOpenGLNativeWidget;
这几个类本质上都是一样的东西,一样的使用方法,只不过随着技术的迭代更新了,渲染越来越快效果越来越好。综上所述,使用的版本越新,vtk控件名就越长,如果你是Qt5.4之后又是vtk8.2之后的版本,果断用名字最长的QVTKOpenGLNativeWidget
学习VTK的参考资料,https://kitware.github.io/vtk-examples/site/ 这里有很多示例。