1 上一篇文章我们已经编译好了VTK的dll,下面我们就来加载他。
2 在Pro里面加载dll
#-------------------------------------------------
#
# Project created by QtCreator 2024-02-04T14:39:07
#
#-------------------------------------------------QT += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = 123
TEMPLATE = app# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0CONFIG += c++11SOURCES += \ form1.cpp \ main.cpp HEADERS += \ form1.hFORMS += \ form1.ui# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
INCLUDEPATH+=E:/VTK/VTK-8.2.0-install/include/vtk-8.2
LIBS+=-LE:/VTK/VTK-8.2.0-install/bin \-lvtkFiltersSources-8.2 \-lvtkCommonColor-8.2 \-lvtkCommonCore-8.2 \-lvtkCommonExecutionModel-8.2 \-lvtkFiltersSources-8.2 \-lvtkInteractionStyle-8.2 \-lvtkRenderingContextOpenGL2-8.2 \-lvtkRenderingCore-8.2\-lvtkRenderingFreeType-8.2 \-lvtkRenderingGL2PSOpenGL2-8.2 \-lvtkRenderingOpenGL2-8.2 \-lvtkGUISupportQt-8.2\-lvtkDICOMParser-8.2\-lvtkIOImage-8.2\-lvtkInteractionImage-8.2
3 在form1 这个ui里面创建4个水平layout,等会用于加载图形窗口。栅格布局。
4 创建.h
#ifndef FORM1_H
#define FORM1_H#include <QWidget>
#include <QVTKOpenGLWidget.h>
#include "QVTKOpenGLNativeWidget.h"namespace Ui {
class Form1;
}class Form1 : public QWidget
{Q_OBJECTpublic:explicit Form1(QWidget *parent = nullptr);Form1(QWidget *parent,int type);~Form1();private:Ui::Form1 *ui;QVTKOpenGLWidget *qvtkWidget;
};#endif // FORM1_H
5 .cpp文件
#include "form1.h"
#include "ui_form1.h"
#include "vtkActor.h"
#include "vtkCamera.h"
#include "vtkCylinderSource.h"
#include "vtkNamedColors.h"
#include "vtkNew.h"
#include "vtkPolyDataMapper.h"
#include "vtkProperty.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderer.h"
#include "vtkGenericOpenGLRenderWindow.h"#include "vtkCellArray.h"
#include "vtkFloatArray.h"
#include "vtkPointData.h"
#include "vtkPoints.h"
#include "vtkPolyData.h"
#include "vtkPolyDataMapper.h"
#include "vtkCamera.h"
#include "vtkActor.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkInteractorStyleImage.h"#include "vtkAutoInit.h"
#include <QDebug>
#include "vtkImageViewer2.h"
#include "vtkSmartPointer.h"
#include "vtkDICOMImageReader.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderWindow.h"
#include "vtkImageSlice.h"
#include "vtkImageResliceMapper.h"
#include <QGridLayout>
#include "QVTKOpenGLNativeWidget.h"
#include "QVTKOpenGLWidget.h"Form1::Form1(QWidget *parent,int type) :QWidget(parent),ui(new Ui::Form1)
{ui->setupUi(this);QVTKOpenGLNativeWidget* vtkWidget = new QVTKOpenGLNativeWidget(this);QVTKOpenGLWidget* vtkWidget2 = new QVTKOpenGLWidget(this);QVTKOpenGLWidget* vtkWidget3 = new QVTKOpenGLWidget(this);QVTKOpenGLWidget* vtkWidget4 = new QVTKOpenGLWidget(this);ui->horizontalLayout->addWidget(qobject_cast<QWidget*>(vtkWidget));ui->horizontalLayout_2->addWidget(qobject_cast<QWidget*>(vtkWidget2));ui->horizontalLayout_3->addWidget(qobject_cast<QWidget*>(vtkWidget3));ui->horizontalLayout_4->addWidget(qobject_cast<QWidget*>(vtkWidget4));//读取Dicom文件vtkSmartPointer<vtkDICOMImageReader> dcmReader = vtkSmartPointer<vtkDICOMImageReader>::New();dcmReader->SetFileName("E:/VTK/DicomFiles/1.2.840.113704.1.111.3352.1107859679.1269.dcm");//读单张切片dcmReader->Update();// 4. 检查是否加载成功if (!dcmReader->GetOutput()){qDebug()<<"无法读取DICOM文件!,EXIT_FAILURE" ;}//实例化一个对象dcmViewervtkSmartPointer<vtkImageViewer2> imageViewer = vtkSmartPointer<vtkImageViewer2>::New();imageViewer->SetInputConnection(dcmReader->GetOutputPort());imageViewer->SetRenderWindow(vtkWidget->GetRenderWindow());imageViewer->SetSlice(0);// 显示第一张切片(如果是多切片数据)imageViewer->Render();imageViewer->GetRenderer()->ResetCamera();//实例化一个对象readervtkSmartPointer<vtkDICOMImageReader> reader = vtkSmartPointer<vtkDICOMImageReader>::New();// 2. 设置 DICOM 文件路径(单个文件)//reader->SetFileName("E:/VTK/DicomFiles/1.2.840.113704.1.111.3352.1107859681.1270.dcm");reader->SetDirectoryName("E:/VTK/DicomFiles");reader->Update();// 4. 检查是否加载成功if (!reader->GetOutput()){qDebug()<<"无法读取DICOM文件!,EXIT_FAILURE" ;}vtkSmartPointer<vtkImageViewer2> imageViewer2 = vtkSmartPointer<vtkImageViewer2>::New();imageViewer2->SetInputConnection(reader->GetOutputPort());imageViewer2->SetRenderWindow(vtkWidget2->GetRenderWindow());imageViewer2->SetSlice(0);// 显示第一张切片(如果是多切片数据)imageViewer2->Render();imageViewer2->GetRenderer()->ResetCamera();//实例化一个对象readervtkSmartPointer<vtkDICOMImageReader> reader3 = vtkSmartPointer<vtkDICOMImageReader>::New();// 2. 设置 DICOM 文件路径(单个文件)reader3->SetFileName("E:/VTK/DicomFiles/1.2.840.113704.1.111.3352.1107859681.1271.dcm");reader3->Update();// 4. 检查是否加载成功if (!reader3->GetOutput()){qDebug()<<"无法读取DICOM文件!,EXIT_FAILURE" ;}vtkSmartPointer<vtkImageViewer2> imageViewer3 = vtkSmartPointer<vtkImageViewer2>::New();imageViewer3->SetInputConnection(reader3->GetOutputPort());imageViewer3->SetRenderWindow(vtkWidget3->GetRenderWindow());imageViewer3->SetSlice(0);// 显示第一张切片(如果是多切片数据)imageViewer3->Render();imageViewer3->GetRenderer()->ResetCamera();//实例化一个对象readervtkSmartPointer<vtkDICOMImageReader> reader4 = vtkSmartPointer<vtkDICOMImageReader>::New();// 2. 设置 DICOM 文件路径(单个文件)reader4->SetFileName("E:/VTK/DicomFiles/1.2.840.113704.1.111.3352.1107859682.1272.dcm");reader4->Update();// 4. 检查是否加载成功if (!reader4->GetOutput()){qDebug()<<"无法读取DICOM文件!,EXIT_FAILURE" ;}vtkSmartPointer<vtkImageViewer2> imageViewer4 = vtkSmartPointer<vtkImageViewer2>::New();imageViewer4->SetInputConnection(reader4->GetOutputPort());imageViewer4->SetRenderWindow(vtkWidget4->GetRenderWindow());imageViewer4->SetSlice(0);// 显示第一张切片(如果是多切片数据)imageViewer4->Render();imageViewer4->GetRenderer()->ResetCamera();}Form1::Form1(QWidget *parent) :QWidget(parent),ui(new Ui::Form1)
{ui->setupUi(this);vtkNew<vtkNamedColors> colors;// Set the background color.std::array<unsigned char, 4> bkg{{26, 51, 102, 255}};colors->SetColor("BkgColor", bkg.data());// This creates a polygonal cylinder model with eight circumferential facets// (i.e, in practice an octagonal prism).vtkNew<vtkCylinderSource> cylinder;cylinder->SetResolution(8);// The mapper is responsible for pushing the geometry into the graphics// library. It may also do color mapping, if scalars or other attributes are// defined.vtkNew<vtkPolyDataMapper> cylinderMapper;cylinderMapper->SetInputConnection(cylinder->GetOutputPort());// The actor is a grouping mechanism: besides the geometry (mapper), it// also has a property, transformation matrix, and/or texture map.// Here we set its color and rotate it around the X and Y axes.vtkNew<vtkActor> cylinderActor;cylinderActor->SetMapper(cylinderMapper);cylinderActor->GetProperty()->SetColor(colors->GetColor4d("Tomato").GetData());cylinderActor->RotateX(30.0);cylinderActor->RotateY(-45.0);// The renderer generates the image// which is then displayed on the render window.// It can be thought of as a scene to which the actor is addedvtkNew<vtkRenderer> renderer;renderer->AddActor(cylinderActor);renderer->SetBackground(colors->GetColor3d("BkgColor").GetData());// Zoom in a little by accessing the camera and invoking its "Zoom" method.renderer->ResetCamera();renderer->GetActiveCamera()->Zoom(1.5);vtkSmartPointer<vtkGenericOpenGLRenderWindow> window = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();window->AddRenderer(renderer);}Form1::~Form1()
{delete ui;
}
6 编译运行
7 dicom文件和VTK dll 见本文链接