1 上一篇文章我们已经编译好了VTK的dll,下面我们就来加载他。
2 在Pro里面加载dll
#-------------------------------------------------
#
# Project created by QtCreator 2024-02-04T14:39:07
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = 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.0
CONFIG += c++11
SOURCES += \
form1.cpp \
main.cpp
HEADERS += \
form1.h
FORMS += \
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_OBJECT
public:
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" ;
}
//实例化一个对象dcmViewer
vtkSmartPointer<vtkImageViewer2> imageViewer = vtkSmartPointer<vtkImageViewer2>::New();
imageViewer->SetInputConnection(dcmReader->GetOutputPort());
imageViewer->SetRenderWindow(vtkWidget->GetRenderWindow());
imageViewer->SetSlice(0);// 显示第一张切片(如果是多切片数据)
imageViewer->Render();
imageViewer->GetRenderer()->ResetCamera();
//实例化一个对象reader
vtkSmartPointer<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();
//实例化一个对象reader
vtkSmartPointer<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();
//实例化一个对象reader
vtkSmartPointer<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 added
vtkNew<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 见本文链接