利用vtkEventQtSlotConnect可以实现Qt和VTK交互,一般在Qt中使用VTK,用的是QVTKWidget(太老了建议不要使用),QVTKOpenGLNaiveWidget等封装了VTK功能的Qt控件,基类为QWidget,可加入Qt的布局中。
QVTKDemo.h
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_QVTKDemo.h"
#include <QPointer>
#include <vtkSmartPointer.h>
#include <vtkObject.h>
class QVTKWidget;
class vtkEventQtSlotConnect;
class QVTKDemo : public QMainWindow
{
Q_OBJECT
public:
QVTKDemo(QWidget *parent = Q_NULLPTR);
public slots:
void slot_clicked(vtkObject*, unsigned long, void*, void*);
private:
Ui::QVTKDemoClass ui;
QPointer<QVTKWidget> vtkWidget;
vtkSmartPointer<vtkEventQtSlotConnect> Connections;
};
QVTKDemo.cpp
#include "QVTKDemo.h"
#include <vtkPolyDataReader.h>
#include <vtkSTLReader.h>
#include <vtkPolyData.h>
#include <vtkDataSet.h>
#include <vtkPointData.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderWindow.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkSmartPointer.h>
#include <vtkActor.h>
#include <vtkCubeSource.h>
#include <vtkEventQtSlotConnect.h>
#include <QVTKWidget.h>
#include <QMenu>
#include <QAction>
#include <QPointer>
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
VTK_MODULE_INIT(vtkRenderingFreeType);
QVTKDemo::QVTKDemo(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
Connections = vtkSmartPointer<vtkEventQtSlotConnect>::New();
vtkWidget = new QVTKWidget(this);
vtkSmartPointer<vtkCubeSource> cube = vtkSmartPointer<vtkCubeSource>::New();
cube->SetXLength(10);
cube->SetYLength(10);
cube->SetZLength(5);
vtkSmartPointer <vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(cube->GetOutputPort());
vtkSmartPointer <vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
vtkSmartPointer<vtkRenderer> ren1 = vtkSmartPointer<vtkRenderer>::New();
ren1->AddActor(actor);
ren1->SetBackground(0.1, 0.2, 0.4);
vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
renWin->AddRenderer(ren1);
// renWin->SetSize(300, 300);
vtkWidget->SetRenderWindow(renWin);
setCentralWidget(vtkWidget);
this->Connections->Connect(
vtkWidget->GetRenderWindow()->GetInteractor(),
vtkCommand::RightButtonPressEvent, this,
SLOT(slot_clicked(vtkObject*, unsigned long, void*, void*)));
}
void QVTKDemo::slot_clicked(vtkObject*, unsigned long, void*,void*)
{
QPointer<QMenu> menu = new QMenu(this);
auto ac_1 = new QAction("Test1", this);
auto ac_2 = new QAction("Test2", this);
menu->addAction(ac_1);
menu->addAction(ac_2);
menu->exec(QCursor::pos());
vtkWidget->GetRenderWindow()->GetInteractor()->RightButtonReleaseEvent();
}