日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

QT+VTK 对接使用

發布時間:2023/12/31 c/c++ 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QT+VTK 对接使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

由于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強大得多的功能??上TK最大的缺點是,沒有免費的教程,它只提供免費的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中找到??赡苣阈枰薷乃穆窂健?/p>

然后,再次打開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 对接使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。