由于MFC和pcl的不兼容问题,只能用QT和VTK进行程序开发,确实是一件蛋疼的事!

出自于QT与VTK结合系列:http://blog.csdn.net/tonylk/article/details/341068

这个教程非常详细.

QT与VTK的结合开发

原文链接:http://blog.csdn.net/tonylk/article/details/341068

VTK全名是VisualizationToolKit,它是一套跨平台的C++库,对OpenGL作了较全面的封装,将各种三维模型的存储,运算,显示,交互等内容全都以类的方式封装起来了,并且提供比OpenGL强大得多的功能。可惜VTK最大的缺点是,没有免费的教程,它只提供免费的API手册,其中只是对各个类的功能罗列而已,而参考书籍则需要花几十美元去购买,所以学习VTK只能依靠它的大量Example了。

由于我的项目需要兼故未来跨平台的可能(目前只在Windows下),所以必须使用一套跨平台的开发库,在VTK/Examples/GUI的例子里,Windows平台下只有SDK,MFC,C++ Builder这几个例子,另外还有Motif,Python,Tcl,选择是不少,但是Motif听说编程比较麻烦,我也从来没有接触过,Tcl和Python作为脚本语言,其性能和安全性则有些令人担忧,也就是说,这里面没有一个是我能使用的。。。说起跨平台,由于单位里项目的关系,我接触得比较多的就是QT了,所以,在未选定VTK之前,其实我是打算使用QT+OpenGL的组合方式来开发这个软件的,其实,如果不考虑跨平台,我还是会选择QT,因为它的事件处理方式对于用惯Delphi的我而言,更为顺手,那么现在使用了VTK,是否还能将VTK和QT组合起来使用呢。。

作为试验,我仿照VTK/Examples/GUI/Win32/SampleMFC,制作了以下这个小程序,很顺利,结果证明了我的猜想,QT和VTK是可以很方便的结合起来的,下面就跟我来一步步制作这个程序吧:

对于新建立的QT对话框程序,源码如下:

#include <qapplication.h>
#include "testwindow.h"
int main(int argc, char** argv)
{QApplication app(argc, argv);TestWindow testwin;testwin.show();app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit()));return app.exec();
}

其中的testwindow.h,是程序的主窗口TestWindow的头文件,一会将会建立该文件。
这段程序所做的是,初始化QApplication,并将TestWindow显示出来,并进入主程序的消息循环app.exec()。

下面实现TestWindow类,分别建立testwindow.h和testwindow.cpp

testwindow.h:
#include <qmainwindow.h>class TestWindow: public QMainWindow
{Q_OBJECT
public:TestWindow();~TestWindow();
};testwindow.cpp:
#include "testwindow.h"
#include "moc_testwindow.h"
TestWindow::TestWindow()
{
}
TestWindow::~TestWindow()
{
}

你是否注意到了testwindow.cpp中的#include "moc_testwindow.h"一行,这个moc_testwindow.h将会建立TestWindow的RTTI信息,并且绑定消息等,它并不需要我们自己实现,而是由qt的一个名为moc的程序建立,在VC的FileView中,右键点击testwindow.h,并选择Settings,然后在打开的Project Settings对话框中选择Custom Build页,在Commands中填入:
moc -i testwindow.h -o moc_testwindow.h
意思是调用moc程序,根据testwindow.h的内容,自动生成一个名为moc_testwindow.h的moc文件。
在Outputs中填入:
moc_testwindow.h

然后,在Project Settings中选中projct,在Link页的Object/library modules中加入:qt-mt334.lib。

编译程序,如果顺利,一个简单的QT程序就写好了,它会在启动后显示一个空白的窗口。

3)加入VTK的代码,这些代码都可以参考Examples/GUI/Win32/SampleMFC程序,将testwindow.h改造成如下:

#include <qmainwindow.h>
#include "vtkRenderer.h"
#include "vtkWin32OpenGLRenderWindow.h"
#include "vtkWin32RenderWindowInteractor.h"class TestWindow: public QMainWindow
{Q_OBJECTpublic:TestWindow();~TestWindow();protected:virtual void paintEvent(QPaintEvent *);virtual bool winEvent(MSG *);private:vtkRenderer *Renderer;vtkWin32OpenGLRenderWindow *RenderWindow;vtkWin32RenderWindowInteractor *Interactor;
};

testwindow.cpp改造成如下:

#include "testwindow.h"
#include "moc_testwindow.h"#include "vtkActor2D.h"
#include "vtkTextMapper.h"
#include "vtkTextProperty.h"
#include "vtkDataSetReader.h"
#include "vtkDataSetMapper.h"#include "vtkCommand.h"
#include "vtkCamera.h"
#include "vtkWin32RenderWindowInteractor.h"
#include "vtkInteractorStyleTrackballCamera.h"TestWindow::TestWindow()
{this->Renderer = vtkRenderer::New();this->Renderer->SetBackground(0.3, 0.5, 0.1);this->RenderWindow = vtkWin32OpenGLRenderWindow::New();this->RenderWindow->AddRenderer(this->Renderer);this->Interactor = vtkWin32RenderWindowInteractor::New();vtkActor2D *actor2d = vtkActor2D::New();vtkTextMapper *txt = vtkTextMapper::New();actor2d->SetMapper(txt);txt->SetInput("Hello World");txt->GetTextProperty()->SetFontSize(24);this->Renderer->AddProp(actor2d);txt->Delete();actor2d->Delete();vtkActor *actor = vtkActor::New();vtkDataSetReader *reader = vtkDataSetReader::New();reader->SetFileName("weldedSpheres.vtk");vtkDataSetMapper *mapper = vtkDataSetMapper::New();mapper->SetInput(reader->GetOutput());actor->SetMapper(mapper);this->Renderer->AddProp(actor);mapper->Delete();reader->Delete();actor->Delete();
}TestWindow::~TestWindow()
{if (this->Interactor) {this->Interactor->Delete();}if (this->Renderer) {this->Renderer->SetRenderWindow(NULL);}if (this->RenderWindow) {this->RenderWindow->Delete();}if (this->Renderer) {this->Renderer->Delete();}
}void TestWindow::paintEvent(QPaintEvent *e)
{if (! this->Interactor->GetInitialized()) {this->RenderWindow->SetWindowId(this->winId());this->RenderWindow->WindowInitialize();this->Interactor->SetRenderWindow(this->RenderWindow);this->Interactor->Initialize();}this->RenderWindow->Render();
}bool TestWindow::winEvent(MSG *msg)
{switch (msg->message) {case WM_LBUTTONDOWN:case WM_LBUTTONUP:case WM_MBUTTONDOWN:case WM_MBUTTONUP:case WM_RBUTTONDOWN:case WM_RBUTTONUP:case WM_MOUSEMOVE:case WM_CHAR:case WM_TIMER:if (this->Interactor->GetInitialized()) {vtkHandleMessage2(msg->hwnd, msg->message, msg->lParam, msg->wParam, this->Interactor);}}return false;
}

其中用到了一个模型文件weldedSpheres.vtk,可以在VTK中找到。可能你需要修改它的路径。

然后,再次打开Proect Settings对话框,在C/C++页中,选择Category:Preprocessor,在Additional include directories:中加入:
D:/VTK,D:/VTK/Parallel,D:/VTK/Hybrid,D:/VTK/Patented,D:/VTK/Rendering,D:/VTK/IO,D:/VTK/Imaging,D:/VTK/Graphics,D:/VTK/Filtering,D:/VTK/Common

选择Link页,选择Category:Input,在Object/library modules:中加入:
vtkRendering.lib vtkGraphics.lib vtkImaging.lib vtkIO.lib vtkFiltering.lib vtkCommon.lib vtkftgl.lib glu32.lib opengl32.lib glu32.lib opengl32.lib vtkfreetype.lib vtkpng.lib vtktiff.lib vtkzlib.lib vtkjpeg.lib vtkexpat.lib
在Addtional library path中加入:
D:/VTK/bin/debug

以上都假设VTK安装在D盘下,如果你安装在其它目录,请修改以上的路径。

好了,重新编译程序,运行,你将看到如下所示的VTK界面。

以上程序只是VTK和QT结合的简单应用,你完全可以将VTK的显示窗封装在一个QTWidget中,然后将其显示在整个程序中的一个区域中。

QT+VTK 对接使用相关推荐

  1. QT VTK 结合开发

    QT VTK 经常需要结合开发,我的环境是 QT5 .VS2015,WIN10 一.先用VS 创建QT项目,界面类的,最好先整好,个别个面处理也可以:保留此项目: 二.使用CMake 将VTK 编译进 ...

  2. cmake开发环境 linux qt_一步步搭建CMake+QT+VTK+BOOST开发环境

    开发环境: 1.可以迅速处理大量并发网络数据包,ASIO库和winpcap 4.1.3库; 2.处理与显示点云模型数据,使用VTK 8.2.0库; 3.项目使用CMake+VC2017编译,GUI使用 ...

  3. Qt VTK软件开发问题学习记录

    1. 0x00000000000000处有未经处理的异样 程序运行时出现下面问题肯定是内存错误,但到底是数组越界(数组边界溢出),指针错误,链接库问题......就需要进一步调试(debug). 链接 ...

  4. VS QT VTK 左下角显示同步小坐标轴

    主要参考 https://blog.csdn.net/qq_37996632/article/details/106415402 https://kitware.github.io/vtk-examp ...

  5. Qt+VTK+PCL图片转灰度图且以灰度为Y轴显示

    效果 头文件GrayVirsual.h #pragma once#include <QtWidgets/QMainWindow> #include <QVTKOpenGLNative ...

  6. Qt+VTK+OCCT读取IGES/STEP模型

    参考链接 主要代码 #include "VTKOCCT.h" #include <BRepPrimAPI_MakeBox.hxx> #include <BRepP ...

  7. VTK与Qt整合的示例

    VTK与Qt整合的示例 VTK附带的程序示例中大多是基于控制台的,作为可视化开发工具包,VTK也可以与很多流行的GUI开发工具整合,比如MFC.Qt(题外话:Qt已经被Digia从诺基亚手中收购了,Q ...

  8. 基于VTK的Qt应用程序开发

    分类: VTK应用示例 2013-03-13 15:51 6622人阅读 评论(25) 收藏 举报 VTKQtCMake 目录(?)[+] VTK附带的程序示例中大多是基于控制台的,作为可视化开发工具 ...

  9. 【转】VTK与Qt整合的示例

    VTK与Qt整合的示例 VTK附带的程序示例中大多是基于控制台的,作为可视化开发工具包,VTK也可以与很多流行的GUI开发工具整合,比如MFC.Qt(题外话:Qt已经被Digia从诺基亚手中收购了,Q ...

最新文章

  1. 前景检测算法_3(GMM)
  2. AcWing 2983. 玩具 / POJ 2318.toys(计算几何基础、二分、判断点和直线的位置关系)
  3. Hyper-V Server 2008系统管理实战
  4. 图解SQL基础知识,小白也能看懂的SQL文章!
  5. scala和java像不像_关于Java和Scala同步的五件事你不知道
  6. 在微型计算机中 如果电源突然中断,微型计算机在工作中电源突然中断,则其中的信息全部丢失,再次通电后也不能恢复的..._考试资料网...
  7. 已经没有再谈话再培养的飞秋必要了
  8. 100套精美英文HTML页面源码
  9. 设计师交流社区,让你的原创设计作品展示给世界
  10. grep 多模式匹配
  11. python 智能造句_用python中的markov链造句
  12. 最强半自动化抓鸡工具打造思路
  13. 【算法】小团的车辆调度(美团2021校招题)
  14. 配置嵌入式Servlet容器
  15. 小米6不显示与电脑连接到服务器,小米6怎么连接不上电脑没反应怎么办
  16. Cesium 地形图
  17. Web(一)基础学习
  18. [chrome插件] 利滚利计算器 银行存款 基金理财 余额宝收益计算
  19. 移动GM220S光猫超级密码及改桥接模式方法
  20. 超级会员创作者收益说明

热门文章

  1. Spring Boot集成JPA的Column注解命名字段无效的问题
  2. 牛客网Java刷题知识点之数组、链表、哈希表、 红黑二叉树
  3. JMP Discovery Summit数据分析峰会登陆中国
  4. CSS魔法堂:深入理解line-height和vertical-align
  5. .NET开发作业调度(job scheduling) - Quartz.NET
  6. js面向对象的五种写法
  7. Linux下的字符集问题
  8. PHP为什么以及什么时候使用单例模式?
  9. TCPDUMP for Android(抓TCP数据包工具)
  10. OSPF的LSA类型 ——连载五自治系统外部的LSA