由于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_OBJECT public:
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. opencv+qt+vtk,编程时报错'detail':ambiguous symbol

    解决办法: 把#include <vtkSmartPointer.h>放到所有头文件的最前面:

  2. [Part 4] 在Windows 10上源码编译PCL 1.8.1支持VTK和QT,可视化三维点云

    本文首发于个人博客https://kezunlin.me/post/2d809f92/,欢迎阅读! Part-4: Compile pcl with vtk qt5 support from sour ...

  3. 海思3519A 移植 Qt 5.5.1

    源码下载 网址:qt-everywhere-opensource-src-5.5.1.tar.gz 配置生成MakeFile 文件 解压源码包,在源码包路径下生成配置 MakeFile : ./con ...

  4. VTK教程系列:VTK基础及应用开发教程

    由于OpenCV不能使用,只能使用VTK库的图像处理库,暂时还没有找到其他可以全面替代的库: CSDN东灵工作室:http://blog.csdn.net/www_doling_net/article ...

  5. Ubuntu系统配置

    0.基本配置 0.1初始设置 (1)开户root账号并重启系统: 打开gedit /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf 添加greeter- ...

  6. 结对编程收获——UI真的没有那么简单

    结对编程收获——UI真的没有那么简单                                                      詹元成 初看作业要求,心里还有一点欣喜,不就是做一个UI ...

  7. Qt、VTK配置常见问题

    QVTKWidget undefined reference to 问题,一定要在pro文件中添加库 libvtkGUISupportQt-6.3. 2. CMAKE_MAKE_PROGRAM     ...

  8. VTK 6.3.0 Qt 5.4 MinGW 4.9.1 Configuration 配置

    Download VTK 6.3.0 Download Qt 5.4 with MinGW 4.9.1 Download CMake 3.2.0 I assume you've already ins ...

  9. **PCL:嵌入VTK/QT显示(Code^_^)

    中国人真是太不知道分享了,看看这个老外的博客,启发性链接. http://www.pcl-users.org/ 1. 这个是可用的源代码: 原文:I saw a thread with links t ...

随机推荐

  1. S-HR薪酬项目与核算表的关系

  2. 关于swift 底部工具栏图标锯齿模糊问题。

    今天在底部工具栏添加图片时发现图片模糊而且有锯齿,开始一直以为是美工给的图片有问题,后来发现是要设置两种图片: 比如  index.png(默认30 * 30),indexSelected(选中后的图 ...

  3. 洛谷P1192 台阶问题【dp递归】

    有NN级的台阶,你一开始在底部,每次可以向上迈最多KK级台阶(最少11级),问到达第NN级台阶有多少种不同方式. 输入输出格式 输入格式: 两个正整数N,K. 输出格式: 一个正整数,为不同方式数,由 ...

  4. [Ynoi2014]不归之人与望眼欲穿的人们

    题目大意: 给定一个序列,每次单点修改一个数,或给定$x$,询问最短的or起来大于等于$x$的区间的长度(不存在输出-1). 解题思路: 在太阳西斜的这个世界里,置身天上之森.等这场战争结束之后,不归 ...

  5. jQuery(UI)常用插件

    jQuery 官方网站:http://jquery.com/ 下载地址:http://jquery.com/download/ 插件地址: http://plugins.jquery.com/ 常用插 ...

  6. 世界对一名颓废者的惩罚——SDOI2019R1游记

    在清明节前,我仿佛已经成为了一名退役选手 一个月做五道题,10天不碰电脑 终日只知颓废 SDOI2019,希望能引起我的警戒吧 Day 0 不说了. 晚上做了三道斯波题(包括去年多省联考的D1T1), ...

  7. Efficient ticket lock synchronization implementation using early wakeup in the presence of oversubscription

    A turn-oriented thread and/or process synchronization facility obtains a ticket value from a monoton ...

  8. magento 在全站或者某页面增加外联js或者css的方法

    1,在整站末尾增加外联资源 找到当前主题的布局文件cms.xml,在<default></default>添加如下代码: <reference name="be ...

  9. 使用大白菜U盘进入PE后再次重启电脑会留后门的清理方法

    使用大白菜U盘进入PE后再次重启电脑会留后门,这个后门主要是自动下载安装一些软件,比如金山毒霸等. 清除方法: 1.每次用完PE重启前,清理以下地方: ①c:\Windows\xxxxx.exe(查看 ...

  10. 【JavaScript】——JS入门

    结束XML之旅,開始JavaScript的学习,看视频.了解了她的前世今生,还是为她捏了把汗啊! 看了部分视 频了,简单的总结一下吧! JavaScript是什么? JavaScript是一种基于面向 ...