文档https://vtk.org/doc/nightly/html/classvtkObject.html
https://vtk.org/Wiki/VTK/Configure_and_Build
先下载源码(貌似需要翻墙)https://vtk.org/download/
貌似需要cmake12来着
可以照着这个装https://blog.csdn.net/qq_39942341/article/details/120896883?spm=1001.2014.3001.5501
sudo apt-get install -y build-essential libgl1-mesa-dev libglew-dev libsdl2-dev libsdl2-image-dev libglm-dev libfreetype6-dev libglfw3-dev libglfw3
tar -zxvf VTK-9.1.0.rc2.tar.gz
mkdir vtk-build&& cd vtk-build
cmake-gui
第一个是源码位置
第二个是刚刚建的目录
然后点configure
这个选unix makefiles
然后finish
勾上BUILD_SHARED_LIBS
勾上VTK_LEGACY_REMOVE
勾上search旁边的Grouped和Advanced
搜索qt
VTK_MODULE_ENABLE_VTK_GUISupportQt可以改成want
VTK_MODULE_ENABLE_VTK_GUISupportQtSQL可以改成want
VTK_MODULE_ENABLE_VTK_Rendering_Qt可以改成want
VTK_MODULE_ENABLE_VTK_ViewsQt可以改成want
点一下configure
确认一下路径
再点一下configure
没有红的
然后generate
make -j 8
sudo make install
sudo ldconfig
然后验证一下
https://kitware.github.io/vtk-examples/site/Cxx/GeometricObjects/CylinderExample/
tar -xvf CylinderExample.tar
cd CylinderExample/
cmake CMakeLists.txt
make
./CylinderExample
然而你可能跟我一样报错
cat /etc/ld.so.conf
sudo sh -c "echo '/usr/local/lib' >> /etc/ld.so.conf"
sudo sh -c "ldconfig"
然后再
./CylinderExample
qt
写一个脚本test.sh
其中/usr/local/lib是vtk的lib的安装位置(默认就是这了,不过有的默认是/usr/local/lib/x86_64-linux-gnu,要检查一下)
#!/bin/bash
base_dir='/usr/local/lib';
echo 'LIBS += -L"'$base_dir'" \ '>src.txt;
for path in `ls $base_dir |grep '^libvtk.*\.so$'`
do
path=${path:3};
path=${path%.so};
echo '-l'$path' \ '>>src.txt;
done
然后
bash test.sh
会生成一个src.txt
添加
第一行改成vtk的include/vtk
后面的就是刚刚src.txt里的
INCLUDEPATH += "/usr/local/include/vtk-9.1"
LIBS += "-L/usr/local/lib" \
-lvtkCommonColor-9.1 \
-lvtkFiltersTexture-9.1 \
-lvtklibharu-9.1 \
-lvtkCommonMath-9.1 \
-lvtkRenderingContext2D-9.1 \
-lvtktiff-9.1 \
-lvtkCommonTransforms-9.1 \
-lvtkIOAMR-9.1 \
-lvtkIOImport-9.1 \
-lvtkkissfft-9.1 \
-lvtkIOExportPDF-9.1 \
-lvtkhdf5-9.1 \
-lvtkIOSQL-9.1 \
-lvtkDICOMParser-9.1 \
-lvtkFiltersFlowPaths-9.1 \
-lvtkFiltersProgrammable-9.1 \
-lvtkRenderingGL2PSOpenGL2-9.1 \
-lvtkFiltersModeling-9.1 \
-lvtkIOLegacy-9.1 \
-lvtkRenderingLabel-9.1 \
-lvtkIOMINC-9.1 \
-lvtkRenderingOpenGL2-9.1 \
-lvtkFiltersParallelImaging-9.1 \
-lvtkIOInfovis-9.1 \
-lvtkjsoncpp-9.1 \
-lvtkRenderingAnnotation-9.1 \
-lvtkWrappingTools-9.1 \
-lvtkpugixml-9.1 \
-lvtkRenderingQt-9.1 \
-lvtkIOExport-9.1 \
-lvtkglew-9.1 \
-lvtkParallelDIY-9.1 \
-lvtkDomainsChemistryOpenGL2-9.1 \
-lvtkInteractionStyle-9.1 \
-lvtkIOGeometry-9.1 \
-lvtkioss-9.1 \
-lvtkFiltersGeneral-9.1 \
-lvtkzlib-9.1 \
-lvtkFiltersHybrid-9.1 \
-lvtkIOHDF-9.1 \
-lvtkIOImage-9.1 \
-lvtkIONetCDF-9.1 \
-lvtkjpeg-9.1 \
-lvtksqlite-9.1 \
-lvtkDomainsChemistry-9.1 \
-lvtkogg-9.1 \
-lvtksys-9.1 \
-lvtkFiltersGeometry-9.1 \
-lvtkexodusII-9.1 \
-lvtkIOPLY-9.1 \
-lvtkIOMotionFX-9.1 \
-lvtkCommonExecutionModel-9.1 \
-lvtkParallelCore-9.1 \
-lvtkmetaio-9.1 \
-lvtkFiltersPoints-9.1 \
-lvtkIOChemistry-9.1 \
-lvtkhdf5_hl-9.1 \
-lvtkChartsCore-9.1 \
-lvtkCommonSystem-9.1 \
-lvtkIOExodus-9.1 \
-lvtkRenderingLOD-9.1 \
-lvtkCommonComputationalGeometry-9.1 \
-lvtkFiltersVerdict-9.1 \
-lvtkgl2ps-9.1 \
-lvtkImagingFourier-9.1 \
-lvtkIOVeraOut-9.1 \
-lvtkIOXMLParser-9.1 \
-lvtkInteractionWidgets-9.1 \
-lvtktheora-9.1 \
-lvtkRenderingVolume-9.1 \
-lvtkIOVideo-9.1 \
-lvtkIOCGNSReader-9.1 \
-lvtkfreetype-9.1 \
-lvtkGeovisCore-9.1 \
-lvtkpng-9.1 \
-lvtkIOLSDyna-9.1 \
-lvtklibxml2-9.1 \
-lvtkInteractionImage-9.1 \
-lvtkverdict-9.1 \
-lvtklzma-9.1 \
-lvtkexpat-9.1 \
-lvtkIOExportGL2PS-9.1 \
-lvtkImagingMorphological-9.1 \
-lvtkcgns-9.1 \
-lvtkRenderingCore-9.1 \
-lvtkIOCONVERGECFD-9.1 \
-lvtkImagingColor-9.1 \
-lvtkImagingCore-9.1 \
-lvtkIOParallel-9.1 \
-lvtkFiltersSources-9.1 \
-lvtkImagingHybrid-9.1 \
-lvtklz4-9.1 \
-lvtkFiltersTopology-9.1 \
-lvtkRenderingVolumeOpenGL2-9.1 \
-lvtkFiltersStatistics-9.1 \
-lvtkImagingMath-9.1 \
-lvtkIOCore-9.1 \
-lvtkFiltersParallel-9.1 \
-lvtkFiltersHyperTree-9.1 \
-lvtkIOXML-9.1 \
-lvtkRenderingVtkJS-9.1 \
-lvtkGUISupportQt-9.1 \
-lvtkCommonCore-9.1 \
-lvtkFiltersSelection-9.1 \
-lvtkViewsQt-9.1 \
-lvtkTestingRendering-9.1 \
-lvtkViewsContext2D-9.1 \
-lvtkIOMovie-9.1 \
-lvtkCommonDataModel-9.1 \
-lvtkImagingGeneral-9.1 \
-lvtkFiltersImaging-9.1 \
-lvtkImagingSources-9.1 \
-lvtkIOCityGML-9.1 \
-lvtkFiltersCore-9.1 \
-lvtkInfovisCore-9.1 \
-lvtkGUISupportQtSQL-9.1 \
-lvtknetcdf-9.1 \
-lvtkIOAsynchronous-9.1 \
-lvtkloguru-9.1 \
-lvtkRenderingContextOpenGL2-9.1 \
-lvtkRenderingUI-9.1 \
-lvtkIOOggTheora-9.1 \
-lvtkRenderingFreeType-9.1 \
-lvtkInfovisLayout-9.1 \
-lvtkFiltersSMP-9.1 \
-lvtkIOParallelXML-9.1 \
-lvtkFiltersExtraction-9.1 \
-lvtkRenderingImage-9.1 \
-lvtkIOIOSS-9.1 \
-lvtkfmt-9.1 \
-lvtkFiltersGeneric-9.1 \
-lvtkdoubleconversion-9.1 \
-lvtkIOTecplotTable-9.1 \
-lvtkImagingStatistics-9.1 \
-lvtkImagingStencil-9.1 \
-lvtklibproj-9.1 \
-lvtkFiltersAMR-9.1 \
-lvtkViewsCore-9.1 \
-lvtkViewsInfovis-9.1 \
-lvtkRenderingSceneGraph-9.1 \
-lvtkIOEnSight-9.1 \
-lvtkCommonMisc-9.1 \
-lvtkIOSegY-9.1 \
在ui文件里加一个OpenGL Widget
右键提升为
第一行填QVTKOpenGLNativeWidget
第二行填QVTKOpenGLNativeWidget.h
然后把勾打上
点add
点击Promote
在mainwindow.cpp里
#include "mainwindow.h"
#include "ui_mainwindow.h"
#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);
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QSurfaceFormat::setDefaultFormat(QVTKOpenGLNativeWidget::defaultFormat());
vtkNew<vtkNamedColors> colors;
vtkNew<vtkSphereSource> sphereSource;
vtkNew<vtkPolyDataMapper> sphereMapper;
sphereMapper->SetInputConnection(sphereSource->GetOutputPort());
vtkNew<vtkActor> sphereActor;
sphereActor->SetMapper(sphereMapper);
sphereActor->GetProperty()->SetColor(colors->GetColor4d("Tomato").GetData());
vtkNew<vtkRenderer> renderer;
renderer->AddActor(sphereActor);
renderer->SetBackground(colors->GetColor3d("SteelBlue").GetData());
vtkNew<vtkGenericOpenGLRenderWindow> renderWindow;
renderWindow->AddRenderer(renderer);
renderWindow->SetWindowName("RenderWindowNoUIFile");
setCentralWidget(ui->openGLWidget);
ui->openGLWidget->setRenderWindow(renderWindow);
}
MainWindow::~MainWindow()
{
delete ui;
}
就可以了
cmake
CMakeLists.txt
可以参考这个
cmake_minimum_required(VERSION 3.5)
project(test VERSION 0.1 LANGUAGES CXX)
find_package(VTK COMPONENTS
CommonColor
CommonCore
FiltersSources
GUISupportQt
InteractionStyle
RenderingContextOpenGL2
RenderingCore
RenderingFreeType
RenderingGL2PSOpenGL2
RenderingOpenGL2
GUISupportQt
RenderingQt
)
if(NOT VTK_FOUND)
message(FATAL_ERROR "${PROJECT_NAME}: Unable to find the VTK build folder.")
endif()
if(NOT(TARGET VTK::GUISupportQt))
message(FATAL_ERROR "${PROJECT_NAME}: VTK not built with Qt support.")
endif()
if(NOT DEFINED VTK_QT_VERSION)
set(VTK_QT_VERSION 5)
endif()
set(qt_components Widgets)
if(${VTK_QT_VERSION} VERSION_GREATER_EQUAL 6)
list(APPEND qt_components OpenGLWidgets)
endif()
list(SORT qt_components)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS ${qt_components})
foreach(_qt_comp IN LISTS qt_components)
list(APPEND qt_modules "Qt${VTK_QT_VERSION}::${_qt_comp}")
endforeach()
message (STATUS "VTK_VERSION: ${VTK_VERSION}, Qt Version: ${Qt${VTK_QT_VERSION}Widgets_VERSION}")
include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
file(GLOB UI_FILES *.ui)
file(GLOB QT_WRAP *.h *.hpp)
file(GLOB CXX_FILES *.cxx *.cpp)
set(PROJECT_SOURCES
${CXX_FILES}
${QT_WRAP}
${UI_FILES}
)
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
qt_add_executable(${PROJECT_NAME}
MANUAL_FINALIZATION
${PROJECT_SOURCES}
)
# Define target properties for Android with Qt 6 as:
# set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
# ${CMAKE_CURRENT_SOURCE_DIR}/android)
# For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation
else()
if(ANDROID)
add_library(${PROJECT_NAME} SHARED
${PROJECT_SOURCES}
)
# Define properties for Android with Qt 5 after find_package() calls as:
# set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
else()
add_executable(${PROJECT_NAME}
${PROJECT_SOURCES}
)
endif()
endif()
target_link_libraries(${PROJECT_NAME} PRIVATE ${qt_modules})
target_link_libraries(${PROJECT_NAME} PRIVATE ${VTK_LIBRARIES})
# vtk_module_autoinit is needed
vtk_module_autoinit(
TARGETS ${PROJECT_NAME}
MODULES ${VTK_LIBRARIES}
)
set_target_properties(${PROJECT_NAME} PROPERTIES
MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
MACOSX_BUNDLE TRUE
WIN32_EXECUTABLE TRUE
)
install(TARGETS ${PROJECT_NAME}
BUNDLE DESTINATION .
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
if(QT_VERSION_MAJOR EQUAL 6)
qt_finalize_executable(${PROJECT_NAME})
endif()