概要
完整的界面使用,点击按钮选择文件,读取stl三维模型,将模型显示在qvtkWidget控件上。
效果展示
1.选择文件地址
2.界面窗口展示
实现步骤
1.点击打开文件按钮,选择文件路径,进行判断,读取文件正常的话继续执行VTK可视化操作,如果读取到的文件内容为空,弹出报错窗口。
注:设置按钮、连接槽函数之类的在这里就不多说了,比较常见的功能了。
stl_fileName = QFileDialog::getOpenFileName(this, QString::fromLocal8Bit("请选择文件路径..."), "*.stl");
if (stl_fileName.isEmpty())
{
QMessageBox::warning(this, "Warning!", "Failed to open the file!");
}
else
{
//读取操作.......
}
2.利用VTK的读取操作,代码解析如下
需要的vtk库函数如下:
#include <vtkSmartPointer.h>
#include <vtkSTLReader.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
第一步,创建STL读取器
// 创建 STL 读取器
vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New();
reader->SetFileName(stl_fileName.toStdString().c_str());
reader->Update();
这里需要注意的一点,在导入stl_fileName的时候进行了一步操作:toStdString().c_str(),如果大家不是在qt界面上进行操作那么完全可以直接写stl_fileName,而在qt界面上使用我们定义的是
QString stl_fileName
所以读取的时候要进行转换字符串,否则会在这个报错:未定义该类型的运算符
第二步,创建 VTK 映射和演员
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputData(reader->GetOutput());
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
这算是VTK比较主体的思想了,大家可以想像成一个舞台表演人员穿着表演服饰。Mapper(映射器):把不同的数据类型,转成图形数据。Actor(演员):执行渲染mapper的对象。
第三步,创建VTK渲染器
// 创建 VTK 渲染器
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
ui.qvtkWidget->GetRenderWindow()->AddRenderer(renderer);//这一步是使用qt的不同之处
// 添加演员到渲染器
renderer->AddActor(actor);
这里的意思是承接上一步操作,渲染器顾名思义是用来渲染图像的,将演员加入渲染器,相当于舞台表演人员站上了舞台。
需要注意这一步:
ui.qvtkWidget->GetRenderWindow()->AddRenderer(renderer);
从ui界面获取qvtkwidget控件的渲染窗口,将渲染器加进去。渲染窗口可以理解成一个剧院,里面有舞台、演员。就可以很好的展示图形了。
注:
在ui界面里已经添加了qvtkwidget控件,如果你正确配置完VTK库的话,正常是可以添加成这样的
注意:左下角的qvtkwidget控件。
最后,初始化一下渲染窗口
// 设置渲染器背景色等属性
renderer->SetBackground(0.1, 0.1, 0.1);
// 渲染窗口初始化
ui.qvtkWidget->GetRenderWindow()->Render();
代码汇总
#include <vtkSmartPointer.h>
#include <vtkSTLReader.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
QString stl_fileName;
stl_fileName = QFileDialog::getOpenFileName(this, QString::fromLocal8Bit("请选择文件路径..."), "*.stl");
if (stl_fileName.isEmpty())
{
QMessageBox::warning(this, "Warning!", "Failed to open the file!");
}
else
{
// 创建 STL 读取器
vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New();
reader->SetFileName(stl_fileName.toStdString().c_str());
reader->Update();
// 创建 VTK 映射和演员
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputData(reader->GetOutput());
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
// 创建 VTK 渲染器
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
ui.qvtkWidget->GetRenderWindow()->AddRenderer(renderer);
// 添加演员到渲染器
renderer->AddActor(actor);
// 设置渲染器背景色等属性
renderer->SetBackground(0.1, 0.1, 0.1);
// 渲染窗口初始化
ui.qvtkWidget->GetRenderWindow()->Render();
}
将这些代码加入正确的位置,即可使用。由于我的项目是主界面子界面分不同的功能类的,而且还有其他功能,就把vtk显示这一部分的代码贴了上来,大家根据需要进行添加,
小结
1.如果出现vtk警告控件过期将被移除:
Generic Warning: In E:\GitHub\VTK\GUISupport\Qt\QVTKWidget.cxx, line 83
QVTKWidget was deprecated for VTK 8.1 and will be removed in a future version.
Generic Warning: In E:\GitHub\VTK\GUISupport\Qt\QVTKPaintEngine.cxx, line 25
QVTKPaintEngine was deprecated for VTK 8.1 and will be removed in a future version
大家可在主界面添加
#include <vtkOutputWindow.h>
...
...
...
vtkOutputWindow::SetGlobalWarningDisplay(0);//屏蔽警告
...
...
2.如果出现vtk界面显示卡顿、乱码已经重复等情况,那可能是和控件界面显示没有初始化有关系
可添加
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2)
VTK_MODULE_INIT(vtkRenderingFreeType)
进行vtk初始化。
记录项目经历,帮助自己理解学习,欢迎大家交流讨论,毕竟项目功能不同、写法不同。大家仅作参考!