编译VTK
安装Qt(安装过程中注意勾选安装MinGW)与CMake,并添加与Qt集成安装的MinGW可执行程序路径(Qt***/Tools/mingw***/bin,即mingw32-make.exe所在路径)到系统环境变量PATH。
解压VTK,建议解压后路径不要包含中文与空格。
打开VTK目录下的CMakeLists.txt文件,在约第219行,将set(VTK_USE_WIN32_THREADS 1)修改为set(VTK_USE_PTHREADS 1),该处原始上下文为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
include(FindThreads)
set(VTK_USE_WIN32_THREADS 0)
set(VTK_USE_PTHREADS 0)
set(VTK_HP_PTHREADS 0)
set(VTK_USE_SPROC 0)
if
(CMAKE_USE_WIN32_THREADS_INIT)
set(VTK_USE_WIN32_THREADS 1)
set(CMAKE_THREAD_LIBS_INIT
""
)
elseif(CMAKE_USE_PTHREADS_INIT)
set(VTK_USE_PTHREADS 1)
if
(CMAKE_HP_PTHREADS_INIT)
set(VTK_HP_PTHREADS 1)
endif()
elseif(CMAKE_USE_SPROC_INIT)
set(VTK_USE_SPROC 1)
endif()
|
打开VTK目录/ThirdParty/libxml2/vtklibxml2/threads.c,在文件开头#include “libxml.h”后添加行:#undef HAVE_WIN32_THREADS,修改后上下文为:
1
2
3
4
|
#define IN_LIBXML
#include "libxml.h"
#undef HAVE_WIN32_THREADS
#include
|
启动CMake,并指定源代码路径和生成路径:
配置生成器为MinGW:
点击CMake中的Configure进行第一次配置,配置完成后,勾选Search框后的Grouped与Advanced。
在CMAKE下设置CMAKE_INSTALL_PREFIX为编译完成后VTK期望的安装路径,如D:/VTK-6.1.0/MinGW。
在Module下勾选Module_vtkGUISupportQt、Module_vtkGUISupportQtOpenGL、Module_vtkGUISupportQtSQL、Module_vtkGUISupportQtWebkit、Module_vtkRenderingQt、Module_vtkViewsQt。
在VTK下勾选VTK_Group_Qt。
如果需要编译为静态链接库,在BUILD下取消勾选BUILD_SHARED_LIBS(如编译为静态链接库,使用时可能会遇到lib文件循环依赖问题)。
如果需要编译为Release,在CMAKE下修改CMAKE_BUILD_TYPE为Release。
如果需要在Debug模式下编译生成的库文件带d后缀,点击Add Entry,手动添加后缀项,Name为CMAKE_DEBUG_POSTFIX,Type为STRING,Value为d。
点击Add Entry,手动添加qmake所在路径,Name为QT_QMAKE_EXECUTABLE,Type为PATH,Value为qmake.exe所在完整路径:
点击Add Entry,手动添加Qt安装目录,Name为CMAKE_PREFIX_PATH,Type为PATH,Value为Qt安装目录(应为包含qmake.exe的bin的父目录,可对照上下两图):
再次点击Configure。
此时将弹出错误:
在Ungrouped Entries下将QT_VTK_VERSION修改为5,再次点击Configure。
此时在界面下方的消息输出窗口中,将输出Configuring done,点击Generate。
生成完成后,将输出Generating done。
在最开始在CMake中指定的生成路径中打开命令行窗口,输入mingw32-make,开始编译生成:
编译完成后,执行mingw32-make install,将编译生成文件输出到已配置的CMAKE_INSTALL_PREFIX目录中,此时该目录中将有bin、include、lib、plugins、share文件夹。
如果在添加了d后缀进行编译后执行mingw32-make install时,提示libQVTKWidgetPlugin.dll文件复制错误,可手动修改生成目录/GUISupport/Qt/PluginInstall.cmake文件,将其中的libQVTKWidgetPlugin.dll修改为libQVTKWidgetPlugind.dll。
使用VTK
本示例程序修改自VTK-6.1.0/Examples/GUI/Qt/ImageViewer。
新建Qt Widgets程序,分别将.pro文件和main.cpp文件修改为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
/* .pro文件 */
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = QtVTK
TEMPLATE = app
INCLUDEPATH += D:/VTK-6.1.0/MinGW/include/vtk-6.1
LIBS += -LD:/VTK-6.1.0/MinGW/lib/ \
-lvtkGUISupportQt-6.1d \
-lvtkIOImage-6.1d \
-lvtkInteractionImage-6.1d \
-lvtkRenderingCore-6.1d \
-lvtkCommonExecutionModel-6.1d \
-lvtkCommonCore-6.1d \
-lvtkRenderingOpenGL-6.1d \
-lvtkInteractionStyle-6.1d
SOURCES += main.cpp
HEADERS +=
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
/* main.cpp */
#include
#include
VTK_MODULE_INIT(vtkRenderingOpenGL)
VTK_MODULE_INIT(vtkInteractionStyle)
#include "vtkImageViewer.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderer.h"
#include "vtkPNGReader.h"
#include "QVTKWidget.h"
#include "vtkImageData.h"
int
main(
int
argc,
char
** argv)
{
QApplication app(argc, argv);
QVTKWidget widget;
char
filename[] =
"D:/test.png"
;
vtkPNGReader* reader = vtkPNGReader::New();
reader->SetFileName(filename);
reader->Update();
vtkImageViewer* imageView = vtkImageViewer::New();
imageView->SetInputConnection(reader->GetOutputPort());
widget.SetRenderWindow(imageView->GetRenderWindow());
imageView->SetupInteractor(widget.GetRenderWindow()->GetInteractor());
imageView->SetColorLevel(138.5);
imageView->SetColorWindow(233);
int
*dims = reader->GetOutput()->GetDimensions();
widget.resize(dims[0], dims[1]);
widget.show();
app.exec();
imageView->Delete();
reader->Delete();
return
0;
}
|
注意:
.pro文件中INCLUDEPATH与LIBS设置为VTK安装后对应路径。
main.cpp文件中如果不正确设置第4、5、6行的模块初始化,可能会报Error: no override found for ‘********’错误。
如果不添加VTK_MODULE_INIT(vtkInteractionStyle),可能会在运行时产生警告,并在调试状态关闭程序时发生崩溃(segmentation fault)。
编译运行后(为能在QtCreator中直接启动程序,可能需要将VTK编译安装后的bin路径添加到系统环境变量PATH),程序将在窗口中显示程序中指定文件名对应的图片(如上面代码中的D:/test.png)。
在Qt Designer中使用VTK插件
在Release模式下编译完成并执行mingw32-make install后,复制CMAKE_INSTALL_PREFIX/plugins/designer目录下的libQVTKWidgetPlugin.dll到Qt/Qt***/***/mingw***/plugins/designer目录(此目录应已有qaxwidget.dll等文件),打开Qt Designer(非QtCreator内的Designer,而是独立的Qt Designer)后,即可发现增加了QVTK分类,并在其下有QVTKWidget控件。
注意:如需要在QtCreator内集成的Designer中使用QVTKWidget,应把libQVTKWidgetPlugin.dll复制到Qt/Qt***/Tools/QtCreator/bin/plugins/designer目录。但由于编译生成QtCreator的编译器版本与生成libQVTKWidgetPlugin.dll的版本可能并不兼容,将导致无法正常加载插件。如果无法直接使用libQVTKWidgetPlugin.dll插件,可在Designer中添加普通的QWidget控件后,手动将其提升为QVTKWidget(对应的头文件为QVTKWidget.h,注意在.pro中设置正确的INCLUDEPATH)。
参考:
1.http://www.vtk.org/Wiki/VTK/Configure_and_Build
2.http://vtk.1045678.n5.nabble.com/vtk-users-VTK-6-0-Compile-issue-with-MinGW64-on-Windows-7-x64-td5724152.html#a5726939
3.http://www.vtk.org/Wiki/VTK/VTK_6_Migration/Factories_now_require_defines
4.http://www.vtk.org/Wiki/VTK/Tutorials/QtSetup
5.http://public.kitware.com/pipermail/vtkusers/2014-July/084396.html