贴几个链接。
在Qt Designer里集成
要实现QVTKWidget在Qt Designer里像Qt的其他标准控件一样拖来拖去,需要把编译生成的QVTKWidgetPlugin.dll/QVTKWidgetPlugin.lib(Release版本) 复制到Qt的安装目录里的plugins\designer目录下。完了以后,你会在Qt Designer里面看到如下的控件:很重要!
1、VTK-6.3.0编译(支持Qt编程)以及QVTKwidget插件安装
https://blog.csdn.net/cfqcfqcfqcfqcfq/article/details/51735895
就是把Debug改为Release,然后ALL BUILD生成,INSTALL仅用于项目仅生成INSTALL,然后就可以生成Release版本的,链接里有插件安装过程。
2、VS2010+VTK6.1+QT5 编译安装教程二 测试
https://blog.csdn.net/u011017966/article/details/42031609
我是用的这篇里面的代码做的测试,刚安好VTK想测试一下,照着网友的程序做的,没有给main.c文件,所以编译总是出现: error LNK2019: 无法解析的外部符号 _main,该符号在函数 _xxxx 中被引用,弄了一下午总算找到了能解决的方法,试了很多办法,最后发现是main.c是空的。心累。中间还遇到 错误1error C2039: “statusBar”: 不是“Ui::TestQTWithVTKClass”的成员, ui.statusBar->showMessage(str);最后发现我再Ui设计里的名称是statusbar,就是一个小小的字母错了搞了大半天,真是被自己蠢哭,主要还是对这些一窍不通,纯小白,慢慢修炼吧。
还有读取图片的格式,BMP的图打开总是出错,没找到原因,所以就用了JPEG,总算能显示了。
#include <vtkBMPReader.h>
#include <vtkJPEGReader.h>
3、vs2013+qt5.51+vtk 实现的 双view,显示并联动操作
https://blog.csdn.net/dd_lucky/article/details/82493930
4、错误处理
MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 [email protected]
https://blog.csdn.net/shenziheng1/article/details/53188168
5、基于VTK的Qt应用程序开发(参考教学东灵工作室的教程)
https://blog.csdn.net/www_doling_net/article/details/8668870#commentBox
6、main.c++文件
#include "testqtwithvtk.h"
#include <QTextCodec>
//程序发布时,可以不要注释以下语句,编译的时候就不会带控制台输出窗口
#pragma comment( linker, "/subsystem:windows /entry:mainCRTStartup" )
int main( int argc, char **argv )
{
QApplication *app = new QApplication(argc, argv);
TestQTWithVTK *window = new TestQTWithVTK();
window->show();
return app->exec();
};
7、testqtwithvtk.cpp
#include "testqtwithvtk.h"
#include <QFileDialog>
#include <QDir>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkImageViewer2.h>
#include <QVTKWidget.h>
#include <vtkBMPReader.h>
#include <vtkJPEGReader.h>
#include <vtkImageActor.h>
#include "vtkEventQtSlotConnect.h"
#include "vtkCommand.h"
TestQTWithVTK::TestQTWithVTK(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
m_pImageViewer = vtkSmartPointer< vtkImageViewer2 >::New();
m_pRenderder = vtkSmartPointer< vtkRenderer >::New();
m_Connections = vtkEventQtSlotConnect::New();
//
ui.qvtkWidget->GetRenderWindow()->AddRenderer(m_pRenderder);
//
connect(ui.actionOpen, SIGNAL( triggered() ), this, SLOT( onOpenSlot() ) );
m_Connections->Connect(ui.qvtkWidget->GetRenderWindow()->GetInteractor(),
vtkCommand::MouseMoveEvent,
this,
SLOT(updateCoords(vtkObject*)));
}
TestQTWithVTK::~TestQTWithVTK()
{
m_Connections->Delete();
}
void TestQTWithVTK::onOpenSlot()
{
QString filter;
filter = "JPEG image file (*.jpg *.jpeg)";
QDir dir;
QString fileName = QFileDialog::getOpenFileName( this,
QString(tr("打开图像")), dir.absolutePath() , filter );
if ( fileName.isEmpty() == true ) return;
//
QByteArray ba = fileName.toLocal8Bit();
const char *fileName_str = ba.data();
//
vtkSmartPointer<vtkJPEGReader> reader = vtkSmartPointer<vtkJPEGReader>::New();
reader->SetFileName(fileName_str);
//
m_pImageViewer->SetInputConnection(reader->GetOutputPort());
//m_pImageViewer->UpdateDisplayExtent();
m_pImageViewer->SetRenderWindow(ui.qvtkWidget->GetRenderWindow());
m_pImageViewer->SetRenderer(m_pRenderder);
m_pImageViewer->SetupInteractor(ui.qvtkWidget->GetRenderWindow()->GetInteractor());
m_pImageViewer->SetSliceOrientationToXY();
m_pImageViewer->GetImageActor()->InterpolateOff();
m_pRenderder->ResetCamera();
m_pRenderder->DrawOn();
ui.qvtkWidget->GetRenderWindow()->Render();
}
void TestQTWithVTK::updateCoords(vtkObject* obj)
{
vtkRenderWindowInteractor* iren = vtkRenderWindowInteractor::SafeDownCast(obj);
int event_pos[2];
iren->GetEventPosition(event_pos);
QString str;
str.sprintf("x=%d : y=%d", event_pos[0], event_pos[1]);
ui.statusbar->showMessage(str);
}
8、testqtwithvtk.h
#ifndef TESTQTWITHVTK_H
#define TESTQTWITHVTK_H
#include <QtWidgets/QMainWindow>
#include "ui_testqtwithvtk.h"
#include "vtkSmartPointer.h"
class vtkImageViewer2;
class vtkRenderer;
class vtkEventQtSlotConnect;
class TestQTWithVTK : public QMainWindow
{
Q_OBJECT
public:
TestQTWithVTK(QWidget *parent = 0);
~TestQTWithVTK();
private:
Ui::TestQTWithVTKClass ui;
private slots:
//响应打开图像文件的槽函数
void onOpenSlot();
private:
vtkSmartPointer< vtkImageViewer2 > m_pImageViewer;
vtkSmartPointer< vtkRenderer > m_pRenderder;
private slots:
//响应鼠标移动的消息,实时输出鼠标的当前位置
void updateCoords(vtkObject* obj);
private:
vtkEventQtSlotConnect* m_Connections;
};
#endif // TESTQTWITHVTK_H
最后的效果: