(41)VTK C++开发示例 ---qt使用vtk最小示例

news2025/5/10 19:56:08

文章目录

    • 1. 概述
    • 2. CMake链接VTK
    • 3. main.cpp文件
    • 4. 演示效果


更多精彩内容
👉内容导航 👈
👉VTK开发 👈

1. 概述

本文演示了在Qt中使用VTK的最小示例程序,使用VTK创建显示一个锥体;

采用Cmake作为构建工具,虽然qmake也可以,但是更推荐CMake。

功能概述:

  1. 初始化 OpenGL 配置
    • 使用 QVTKOpenGLNativeWidget::defaultFormat() 获取 VTK 推荐的 OpenGL 配置,并通过 QSurfaceFormat::setDefaultFormat() 设置为 Qt 的全局默认格式,确保 VTK 和 Qt 的 OpenGL 上下文兼容。
  2. 创建 Qt 应用程序
    • 使用 QApplication 创建一个 Qt 应用程序实例,用于管理应用程序的事件循环。
  3. 创建 VTK 渲染管线
    • 几何体源:使用 vtkConeSource 创建一个圆锥体几何体。
    • 数据映射器:使用 vtkPolyDataMapper 将几何体数据映射到渲染管线。
    • Actor:使用 vtkActor 表示场景中的对象,并将数据映射器绑定到 Actor。
    • 渲染器:使用 vtkRenderer 负责渲染场景,将 Actor 添加到渲染器中,并设置背景颜色。
  4. 集成到 Qt 界面
    • 使用 QVTKOpenGLNativeWidget 创建一个 VTK 和 Qt 集成的渲染窗口小部件。
    • 将渲染器添加到小部件的渲染窗口中。
  5. 显示窗口并运行事件循环
    • 调用 widget.show() 显示渲染窗口。
    • 调用 app.exec() 启动 Qt 的事件循环,保持窗口运行。
环境说明
系统ubuntu22.04、windows11
cmake3.22、3.25
Qt5.14.2
编译器g++11.4、msvc2017
VTK9.4.1

2. CMake链接VTK

cmake_minimum_required(VERSION 3.16)

project(untitled LANGUAGES CXX)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(VTK_DIR E:/lib/VTK/lib/cmake/vtk-9.4) # 添加VTK库路径
# 查询VTK库
find_package(VTK COMPONENTS
CommonCore
FiltersSources
RenderingCore
GUISupportQt
)

if (NOT VTK_FOUND)
  message("VTK not found")
endif()

find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)

add_executable(${PROJECT_NAME}
main.cpp
)
target_link_libraries(${PROJECT_NAME} Qt${QT_VERSION_MAJOR}::Widgets ${VTK_LIBRARIES}) # 链接库

include(GNUInstallDirs)
install(TARGETS ${PROJECT_NAME}
  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

# 设置VTK模块自动初始化
vtk_module_autoinit(
TARGETS ${PROJECT_NAME}
MODULES ${VTK_LIBRARIES}
)

关键添加如下所示三处:
在这里插入图片描述

3. main.cpp文件

#include <QApplication> // 包含 Qt 应用程序类

#include <vtkActor.h> // VTK Actor 类,用于表示场景中的对象
#include <vtkConeSource.h> // VTK 圆锥体源,用于生成圆锥几何体
#include <vtkPolyDataMapper.h> // VTK 数据映射器,将几何数据映射到图形管线
#include <vtkRenderWindow.h> // VTK 渲染窗口,用于显示渲染内容
#include <vtkRenderer.h> // VTK 渲染器,负责场景的渲染
#include <QSurfaceFormat> // Qt 表面格式类,用于设置 OpenGL 格式
#include <QVTKOpenGLNativeWidget.h> // VTK 和 Qt 的集成小部件,用于显示 VTK 渲染内容

int main(int argc, char* argv[])
{
  // 统一 Qt 和 VTK 的 OpenGL 上下文配置,解决因 OpenGL 参数不匹配导致的渲染问题。
  // 通过 QVTKOpenGLNativeWidget::defaultFormat() 获取 VTK 推荐的 OpenGL 配置
  // 用 QSurfaceFormat::setDefaultFormat() 将其设为 Qt 全局默认格式
  QSurfaceFormat::setDefaultFormat(QVTKOpenGLNativeWidget::defaultFormat());
  // 创建 Qt 应用程序对象
  QApplication app(argc, argv);

  // 创建一个 VTK-Qt 集成的渲染窗口小部件
  QVTKOpenGLNativeWidget widget;
  // 创建一个圆锥体几何体源
  vtkNew<vtkConeSource> cone;
  // 创建一个数据映射器,将几何体数据映射到渲染管线
  vtkNew<vtkPolyDataMapper> mapper;
  // 创建一个 Actor,用于表示场景中的对象
  vtkNew<vtkActor> actor;
  // 创建一个渲染器,负责渲染场景
  vtkNew<vtkRenderer> renderer;
  // 将圆锥体几何体的输出连接到数据映射器
  mapper->SetInputConnection(cone->GetOutputPort());
  // 将数据映射器设置到 Actor
  actor->SetMapper(mapper);
  // 将 Actor 添加到渲染器
  renderer->AddActor(actor);
  // 设置渲染器的背景颜色(RGB 值)
  renderer->SetBackground(0.2, 0.3, 0.4);
  // 将渲染器添加到渲染窗口小部件
  widget.renderWindow()->AddRenderer(renderer);

  // 显示渲染窗口小部件
  widget.show();

  // 运行 Qt 应用程序事件循环
  return app.exec();
}

4. 演示效果

在这里插入图片描述



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2372575.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OS7.【Linux】基本指令入门(6)

目录 1.zip和unzip 配置指令 使用 两个名词:打包和压缩 打包 压缩 Linux下的操作演示 压缩和解压缩文件 压缩和解压缩目录 -d选项 2.tar Linux下的打包和压缩方案简介 czf选项 xzf选项 -C选项 tzf选项 3.bc 4.uname 不带选项的uname -a选项 -r选项 -v选项…

国标GB28181视频平台EasyCVR安防系统部署知识:如何解决异地监控集中管理和组网问题

在企业、连锁机构及园区管理等场景中&#xff0c;异地监控集中管控与快速组网需求日益迫切。弱电项目人员和企业管理者亟需整合分散监控资源&#xff0c;实现跨区域统一管理与实时查看。 一、解决方案 案例一&#xff1a;运营商专线方案​ 利用运营商专线&#xff0c;连接各分…

O2O上门服务如何颠覆传统足浴行业?真实案例分析

在湖南经营传统足浴店的张总最近遇到了件让他哭笑不得的事。原本他的门店生意还算稳定&#xff0c;虽然这两年行情不好&#xff0c;但靠着老顾客还能勉强维持。可谁想到&#xff0c;一次好心帮忙&#xff0c;竟让他发现了行业的新天地。 几年前&#xff0c;张总的一位做砂石生意…

金仓数据库永久增量备份技术原理与操作

先用一张图说明一下常见的备份方式 为什么需要永久增量备份 传统的数据库备份方案通常是间隔7天对数据库做一次全量备份&#xff08;完整备份&#xff09;&#xff0c;每天会基于全量备份做一次增量备份&#xff0c;如此循环&#xff0c;这种备份方案在全备数据量过大场景下…

19、HashTable(哈希)、位图的实现和布隆过滤器的介绍

一、了解哈希【散列表】 1、哈希的结构 在STL中&#xff0c;HashTable是一个重要的底层数据结构, 无序关联容器包括unordered_set, unordered_map内部都是基于哈希表实现 哈希表又称散列表&#xff0c;一种以「key-value」形式存储数据的数据结构。哈希函数&#xff1a;负责将…

mysql中int(1) 和 int(10) 有什么区别?

困惑 最近遇到个问题&#xff0c;有个表的要加个user_id字段&#xff0c;user_id字段可能很大&#xff0c;于是我提mysql工单​​alter table xxx ADD user_id int(1)​​。领导看到我的sql工单&#xff0c;于是说&#xff1a;这int(1)怕是不够用吧&#xff0c;接下来是一通解…

FreeRTOS如何实现100%的硬实时性?

实时系统在嵌入式应用中至关重要&#xff0c;其核心在于确保任务在指定时间内完成。根据截止时间满足的严格程度&#xff0c;实时系统分为硬实时和软实时。硬实时系统要求任务100%满足截止时间&#xff0c;否则可能导致灾难性后果&#xff0c;例如汽车安全系统或医疗设备。软实…

element-ui日期时间选择器禁止输入日期

需求解释&#xff1a;时间日期选择器&#xff0c;下方日期有禁止选择范围&#xff0c;所以上面的日期输入框要求禁止输入&#xff0c;但时间输入框可以输入&#xff0c;也就是下图效果&#xff0c;其中日历中的禁止选择可以通过【picker-options】这个属性实现&#xff0c;此属…

[论文阅读]Deeply-Supervised Nets

摘要 我们提出的深度监督网络&#xff08;DSN&#xff09;方法在最小化分类误差的同时&#xff0c;使隐藏层的学习过程更加直接和透明。我们尝试通过研究深度网络中的新公式来提升分类性能。我们关注卷积神经网络&#xff08;CNN&#xff09;架构中的三个方面&#xff1a;&…

多模态大语言模型arxiv论文略读(六十二)

MileBench: Benchmarking MLLMs in Long Context ➡️ 论文标题&#xff1a;MileBench: Benchmarking MLLMs in Long Context ➡️ 论文作者&#xff1a;Dingjie Song, Shunian Chen, Guiming Hardy Chen, Fei Yu, Xiang Wan, Benyou Wang ➡️ 研究机构: The Chinese Univers…

现代框架对SEO的深度影响

第8章&#xff1a;现代框架对SEO的深度影响 1. 引言 Next 和 Nuxt 是两个 &#x1f525;热度和使用度都最高 的现代 Web 开发框架&#xff0c;它们分别基于 ⚛️React 和 &#x1f596;Vue 构建&#xff0c;也代表了这两个生态的 &#x1f310;全栈框架。 Next 是由 Vercel 公司…

密码学--RSA

一、实验目的 1.随机生成明文和加密密钥 2.利用C语言实现素数选择&#xff08;素性判断&#xff09;的算法 3.利用C语言实现快速模幂运算的算法&#xff08;模重复平方法&#xff09; 4.利用孙子定理实现解密程序 5.利用C语言实现RSA算法 6.利用RSA算法进行数据加/解密 …

如何选择自己喜欢的cms

选择内容管理系统cms what is cms1.whatcms.org2.IsItWP.com4.Wappalyzer5.https://builtwith.com/6.https://w3techs.com/7. https://www.netcraft.com/8.onewebtool.com如何在不使用 CMS 检测器的情况下手动检测 CMS 结论 在开始构建自己的数字足迹之前&#xff0c;大多数人会…

BUUCTF——杂项渗透之赛博朋克

下载附件&#xff0c;是一个txt。打开查看&#xff0c;数据如下&#xff1a; 感觉这个像是用十六进制编辑器打开后的图片数据。为了验证此想法&#xff0c;我用010editor打开&#xff0c;发现文件头的确是png图片的文件头。 把txt文件后缀改成png格式&#xff0c;再双击打开&am…

React 中集成 Ant Design 组件库:提升开发效率与用户体验

React 中集成 Ant Design 组件库:提升开发效率与用户体验 一、为什么选择 Ant Design 组件库?二、基础引入方式三、按需引入(优化性能)四、Ant Design Charts无缝接入图标前面提到了利用Redux提供全局维护,但如果在开发时再自己手动封装组件,不仅效率不高,可能开发的组件…

编译原理实验 之 语法分析程序自动生成工具Yacc实验

文章目录 实验环境准备复现实验例子分析总的文件架构实验任务 什么是Yacc Yacc(Yet Another Compiler Compiler)是一个语法分析程序自动生成工具&#xff0c;Yacc实验通常是在编译原理相关课程中进行的实践项目&#xff0c;旨在让学生深入理解编译器的语法分析阶段以及掌握Yac…

从“山谷论坛”看AI七剑下天山

始于2023年的美国山谷论坛(Hill and Valley Forum)峰会,以“国会山与硅谷”命名,寓意连接科技界与国家安全战略。以人工智能为代表的高科技,在逆全球化时代已成为大国的致胜高点。 论坛创办者Jacob Helberg,现在是华府的副国务卿,具体负责经济、环境和能源事务。早先曾任…

C——数组和函数实践:扫雷

此篇博客介绍用C语言写一个扫雷小游戏&#xff0c;所需要用到的知识有&#xff1a;函数、数组、选择结构、循环结构语句等。 所使用的编译器为:VS2022。 一、扫雷游戏是什么样的&#xff0c;如何玩扫雷游戏&#xff1f; 如图&#xff0c;是一个标准的扫雷游戏初始阶段。由此…

sui在windows虚拟化子系统Ubuntu和纯windows下的安装和使用

一、sui在windows虚拟化子系统Ubuntu下的安装使用&#xff08;WindowsWsl2Ubuntu24.04&#xff09; 前言&#xff1a;解释一下WSL、Ubuntu的关系 WSL&#xff08;Windows Subsystem for Linux&#xff09;是微软推出的一项功能&#xff0c;允许用户在 Windows 系统中原生运行…

智能合约在去中心化金融(DeFi)中的核心地位与挑战

近年来&#xff0c;区块链技术凭借其去中心化、不可篡改等特性&#xff0c;在全球范围内掀起了技术革新浪潮。去中心化金融&#xff08;DeFi&#xff09;作为区块链技术在金融领域的重要应用&#xff0c;自 2018 年以来呈现出爆发式增长态势。据 DeFi Pulse 数据显示&#xff0…