vs2013+qt5.51+vtk 实现的 双view,显示并联动操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dd_lucky/article/details/82493930

本文参考了https://blog.csdn.net/Jecklin_online/article/details/82187558的博客,此博客是用vtk实现的,此文是在此基础上增加了qt界面是利用了qt的QVTKWidget来实现的。

1.首先我们必须将QVTKWidget加入到Qt Designer,只需找到编译好的vtk的release版本下的QVTKWidgetPlugin.dll,QVTKWidgetPlugin.exp,QVTKWidgetPlugin.lib放入到自己QT下的designer下即可(我的目录是:F:\Qt\Qt5.5.1\5.5\msvc2013\plugins\designer)

2.写好CmakeLists.txt


CMAKE_MINIMUM_REQUIRED( VERSION 2.8 )
PROJECT( qt )

#----------------------------------------------------------------------------------
FIND_PACKAGE( VTK REQUIRED )
FIND_PACKAGE( Qt5Widgets )

INCLUDE( ${VTK_USE_FILE} )


#----------------------------------------------------------------------------------
#	定义变量PROJECT_SRCS,其值为所列表的文件列表,包含所有源文件
SET( PROJECT_SRCS
	main.cpp
	ProjectMainWindow.cpp
	ProjectMainWindow.h
	
    )
#	定义变量PROJECT_UIS,其值为所列表的文件列表,包含所有的ui文件
SET( PROJECT_UIS
    ProjectMainWindow.ui
)
#	定义变量PROJECT_MOC_HDRS,其值为所列表的文件列表,包含所有Q_OBJECT的头文件
SET( PROJECT_MOC_HDRS
  ProjectMainWindow.h
  
)

#----------------------------------------------------------------------------------
#	QT5_WRAP_UI通过QT的uic.exe生成UI文件对应的ui_xxx.h文件,
#	并将生成的moc_xxx.h文件列表存储于变量PROJECT_UIS_H 里
QT5_WRAP_UI( PROJECT_UIS_H 
             ${PROJECT_UIS}
           )
#	QT5_WRAP_CPP通过QT的moc.exe将包含的Q_OBJECT的文件生成对应的moc_xxx.cxx文件,
#	并将生成的moc_xxx.cxx文件列表存储于变量PROJECT_MOC_SRCS里	
QT5_WRAP_CPP( PROJECT_MOC_SRCS 
              ${PROJECT_MOC_HDRS}
            )

#----------------------------------------------------------------------------------
#	Qt的MOC和UIC程序生成的moc_xxx.cxx和ui.xxx.h等文件是存放在CMAKE的
#	where to bulid the binaries 里指定的目录,所以必须把这些路径包含进来
INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR} 
                     ${CMAKE_CURRENT_BINARY_DIR} 
                     ${VTK_DIR} 
                   )

#	Qt程序如果有资源文件(*.qrc),要包含资源文件,
#	qt5_add_resources 用的rcc.exe生成相应的qrc_xxx.cpp文件,
#	并将生成的文件列表存储于变量Project_RCC_SRCS里
#	set(Project_RCCS YourProjectName.qrc)
#	qt5_add_resources(Project_RCCS_SRCS ${Project_RCCS})



#	根据程序的cpp文件、头文件以及生成的ui_xxx.h、moc_xxx.cxx、qrc_xxx.cxx
#	等生成可执行文件,并链接Qt的动态库(Qt的动态都定义在QT_LIBRARIES变量里了)
ADD_EXECUTABLE( qt 
                ${PROJECT_SRCS} 
                ${PROJECT_UIS_H} 
                ${PROJECT_MOC_SRCS} 
              )

TARGET_LINK_LIBRARIES ( qt
  ${VTK_LIBRARIES}
  #QVTK 
  )

3.用cmake编译

4.main函数

#include "ProjectMainWindow.h"
#include <QTextCodec>

//程序发布时,可以不要注释以下语句,编译的时候就不会带控制台输出窗口
//#pragma comment( linker, "/subsystem:windows /entry:mainCRTStartup" )

int main( int argc, char **argv ) 
{
	QApplication *app = new QApplication(argc, argv);
	ProjectMainWindow *window = new ProjectMainWindow();
	window->show();
	return app->exec();
};

5.ProjectMainwindow.h

#ifndef Project_MainWindow_H
#define Project_MainWindow_H

#include <QMainWindow>
#include "ui_ProjectMainWindow.h"
#include <vtkSmartPointer.h>

class vtkImageViewer2;
class vtkRenderer;
class vtkEventQtSlotConnect;
class vtkObject;
class vtkCommand;

class ProjectMainWindow : public QMainWindow
{
	Q_OBJECT

public:
	ProjectMainWindow(QWidget *parent = 0);
	~ProjectMainWindow();

private:
	Ui::ProjectMainWindowClass ui;

private slots:
	//响应打开图像文件的槽函数
	void onOpenSlot();


private:

	vtkSmartPointer< vtkRenderer > m_pRenderder_left;
	vtkSmartPointer< vtkRenderer > m_pRenderder_right;

	vtkEventQtSlotConnect* m_Connections;
};

#endif

6.ProjectMainwindow.cpp

#include "ProjectMainWindow.h"  
#include <QFileDialog>  
#include <QDir>  
#include <vtkRenderWindow.h>  
#include <vtkRenderer.h>  
#include <vtkImageViewer2.h>  
#include <QVTKWidget.h>  
#include <vtkBMPReader.h>  
#include <vtkJPEGReader.h>
#include <vtkSTLReader.h>
#include <vtkImageActor.h>  
#include <qdebug.h>


#include "Header.h"
//#include "Header2.h"
#include "vtkEventQtSlotConnect.h"  
#include "vtkCommand.h"  

ProjectMainWindow::ProjectMainWindow(QWidget *parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);
	m_pRenderder_left = vtkSmartPointer< vtkRenderer >::New();
	m_pRenderder_right = vtkSmartPointer< vtkRenderer >::New();
	m_Connections = vtkEventQtSlotConnect::New();

	// 设置m_QVTKWidget的渲染器  
	ui.qvtkWidget_1->GetRenderWindow()->AddRenderer(m_pRenderder_left);
	ui.qvtkWidget_1->GetRenderWindow()->AddRenderer(m_pRenderder_right);

	//连接打开的信号与相应的槽    
	connect(ui.actionOpen, SIGNAL(triggered()), this, SLOT(onOpenSlot()));
	connect(ui.actionExit, SIGNAL(triggered()), this, SLOT(close()));


	vtkSmartPointer<vtkRenderWindowInteractor>interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
	vtkSmartPointer<myInteractorStyle> style = vtkSmartPointer<myInteractorStyle>::New();
	style->SetLeftRender(m_pRenderder_left);
	style->SetRightRender(m_pRenderder_right);
	interactor->SetInteractorStyle(style);


	//vtkSmartPointer<vtkCamera> camera = vtkSmartPointer<vtkCamera>::New();
	//camera->SetPosition(4, 4, 4);
	//m_pRenderder_left->SetActiveCamera(camera);
	//m_pRenderder_right->SetActiveCamera(camera);

	//vtkSmartPointer<vtkRenderWindowInteractor>interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();


	//vtkSmartPointer<myInteractorStyle> style = vtkSmartPointer<myInteractorStyle>::New();
	//style->SetLeftRender(m_pRenderder_left);
	//style->SetRightRender(m_pRenderder_right);
	//style->SetCamera(camera);

	//interactor->SetInteractorStyle(style);

	ui.qvtkWidget_1->GetRenderWindow()->SetInteractor(interactor);
	ui.qvtkWidget_1->GetRenderWindow()->Render();

}

ProjectMainWindow::~ProjectMainWindow()
{
	m_Connections->Delete();
}

void ProjectMainWindow::onOpenSlot()
{

	double leftViewStation[4] = { 0.0, 0.0, 0.5, 1.0 };
	double rightViewStation[4] = { 0.5, 0.0, 1.0, 1.0 };

	QString filter;
	filter = "stl file (*.stl)";
	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();

	qDebug() << fileName_str << endl;
	// 用vtkSTLReader读取STL图像  
	vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New();
	reader->SetFileName(fileName_str);
	reader->Update();

	vtkSmartPointer<vtkPolyDataMapper> mapper =
		vtkSmartPointer<vtkPolyDataMapper>::New();
	mapper->SetInputConnection(reader->GetOutputPort());

	vtkSmartPointer<vtkActor> actor =
		vtkSmartPointer<vtkActor>::New();

	actor->SetMapper(mapper);

	m_pRenderder_left->AddActor(actor);
	m_pRenderder_left->ResetCamera();
	m_pRenderder_left->DrawOn();
	m_pRenderder_left->SetViewport(leftViewStation);

	
	
	m_pRenderder_right->AddActor(actor);
	m_pRenderder_right->ResetCamera();
	m_pRenderder_right->DrawOn();
	m_pRenderder_right->SetViewport(rightViewStation);
	

	
}

7.新建一个Header.h

#include <vtkSmartPointer.h>
#include <vtkCubeSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkProperty.h>
#include <vtkCallbackCommand.h>
#include <vtkTransform.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkCamera.h>


class myInteractorStyle :public vtkInteractorStyleTrackballCamera
{
public:

	static myInteractorStyle* New()
	{
		return new myInteractorStyle;
	}

	void    SetLeftRender(vtkRenderer *render)
	{
		this->m_leftRender = render;
	}

	void    SetRightRender(vtkRenderer *render)
	{
		this->m_rightRender = render;
	}

	void    OnMouseMove()
	{
		vtkInteractorStyleTrackballCamera::OnMouseMove();
		this->CameraSynchronous();
	}

	void OnLeftButtonDown()
	{
		vtkInteractorStyleTrackballCamera::OnLeftButtonDown();
		this->CameraSynchronous();
	}

	void OnLeftButtonUp()
	{
		vtkInteractorStyleTrackballCamera::OnLeftButtonUp();
		this->CameraSynchronous();
	}

	void OnMiddleButtonDown()
	{
		vtkInteractorStyleTrackballCamera::OnMiddleButtonDown();
		this->CameraSynchronous();
	}

	void OnMiddleButtonUp()
	{
		vtkInteractorStyleTrackballCamera::OnMiddleButtonUp();
		this->CameraSynchronous();
	}

	void OnRightButtonDown()
	{
		vtkInteractorStyleTrackballCamera::OnRightButtonDown();
		this->CameraSynchronous();
	}

	void OnRightButtonUp()
	{
		vtkInteractorStyleTrackballCamera::OnRightButtonUp();
		this->CameraSynchronous();
	}

	void OnMouseWheelForward()
	{
		vtkInteractorStyleTrackballCamera::OnMouseWheelForward();
		this->CameraSynchronous();
	}

	void OnMouseWheelBackward()
	{
		vtkInteractorStyleTrackballCamera::OnMouseWheelBackward();
		this->CameraSynchronous();
	}



	void Rotate()
	{
		vtkInteractorStyleTrackballCamera::Rotate();
		this->CameraSynchronous();
	}

	void Spin()
	{
		vtkInteractorStyleTrackballCamera::Spin();
		this->CameraSynchronous();
	}

	void Pan()
	{
		vtkInteractorStyleTrackballCamera::Pan();
		this->CameraSynchronous();
	}

	void Dolly()
	{
		vtkInteractorStyleTrackballCamera::Dolly();
		this->CameraSynchronous();
	}




private:
	void    CameraSynchronous()
	{
		vtkCamera *leftCamera = m_leftRender->GetActiveCamera();
		vtkCamera *rightCamera = m_rightRender->GetActiveCamera();

		//获取窗口大小
		int *winSize = this->GetInteractor()->GetRenderWindow()->GetSize();

		//获取事件窗口位置
		int eventStation[3];
		this->GetInteractor()->GetEventPosition(eventStation);

		if (eventStation[0] < winSize[0] / 2)
		{
			rightCamera->SetPosition(leftCamera->GetPosition());
			rightCamera->SetFocalPoint(leftCamera->GetFocalPoint());
			rightCamera->SetViewUp(leftCamera->GetViewUp());
			m_rightRender->ResetCameraClippingRange();

		}
		else
		{
			leftCamera->SetPosition(rightCamera->GetPosition());
			leftCamera->SetViewUp(rightCamera->GetViewUp());
			leftCamera->SetFocalPoint(rightCamera->GetFocalPoint());
			m_leftRender->ResetCameraClippingRange();

		}

		this->GetInteractor()->GetRenderWindow()->Render();
	}

private:
	vtkRenderer     *m_leftRender;
	vtkRenderer     *m_rightRender;

};

8.ProjectMainwindow.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>ProjectMainWindowClass</class>
 <widget class="QMainWindow" name="ProjectMainWindowClass">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>607</width>
    <height>583</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>ProjectMainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QVTKWidget" name="qvtkWidget_1">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>20</y>
      <width>571</width>
      <height>331</height>
     </rect>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menuBar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>607</width>
     <height>23</height>
    </rect>
   </property>
   <widget class="QMenu" name="menu">
    <property name="title">
     <string>文件</string>
    </property>
    <addaction name="actionOpen"/>
   </widget>
   <widget class="QMenu" name="menu_2">
    <property name="title">
     <string>退出</string>
    </property>
    <addaction name="actionExit"/>
   </widget>
   <addaction name="menu"/>
   <addaction name="menu_2"/>
  </widget>
  <widget class="QStatusBar" name="statusBar"/>
  <action name="actionPrint">
   <property name="text">
    <string>Print</string>
   </property>
  </action>
  <action name="actionHelp">
   <property name="checkable">
    <bool>false</bool>
   </property>
   <property name="text">
    <string>Help</string>
   </property>
  </action>
  <action name="actionSave">
   <property name="text">
    <string>Save</string>
   </property>
  </action>
  <action name="actionOpen">
   <property name="text">
    <string>open</string>
   </property>
  </action>
  <action name="actionExit">
   <property name="text">
    <string>exit</string>
   </property>
  </action>
 </widget>
 <customwidgets>
  <customwidget>
   <class>QVTKWidget</class>
   <extends>QWidget</extends>
   <header>QVTKWidget.h</header>
  </customwidget>
 </customwidgets>
 <resources/>
 <connections/>
</ui>

显示效果图

无论点那个都可以使图像联动

猜你喜欢

转载自blog.csdn.net/dd_lucky/article/details/82493930