BestMPRBaseVtk Qt交互器QVTKInteractor详解
2023-10-30 20:02:44
1 源码分析
1.1 QVTKInteractor类的继承关系
class QVTKInteractor : public QObject
{
Q_OBJECT
public:
QVTKInteractor(QWidget *parent = nullptr);
~QVTKInteractor();
void SetRenderWindow(vtkRenderWindow *renWin);
void SetInteractorStyle(vtkInteractorStyle *style);
void Initialize();
void SetSize(int width, int height);
void SetRenderEnabled(bool renderEnabled);
bool GetRenderEnabled();
void StartInteraction();
void EndInteraction();
protected:
bool eventFilter(QObject *object, QEvent *event) override;
private:
vtkRenderWindowInteractor *Interactor;
};
QVTKInteractor类继承自QObject类,它是一个Qt对象。QVTKInteractor类提供了一系列方法来设置渲染窗口、设置交互器样式、初始化交互器、设置交互器大小、设置渲染是否启用、启动交互、结束交互等。
1.2 QVTKInteractor类的构造函数
QVTKInteractor::QVTKInteractor(QWidget *parent /*= nullptr*/)
: QObject(parent)
{
this->Interactor = vtkRenderWindowInteractor::New();
this->Interactor->SetInteractorStyle(vtkInteractorStyleTrackballCamera::New());
this->SetRenderEnabled(true);
}
QVTKInteractor类的构造函数首先创建一个vtkRenderWindowInteractor对象,然后设置它的交互器样式为vtkInteractorStyleTrackballCamera。最后,将渲染是否启用设置为true。
1.3 QVTKInteractor类的SetRenderWindow方法
void QVTKInteractor::SetRenderWindow(vtkRenderWindow *renWin)
{
this->Interactor->SetRenderWindow(renWin);
}
SetRenderWindow方法设置渲染窗口。
1.4 QVTKInteractor类的SetInteractorStyle方法
void QVTKInteractor::SetInteractorStyle(vtkInteractorStyle *style)
{
this->Interactor->SetInteractorStyle(style);
}
SetInteractorStyle方法设置交互器样式。
1.5 QVTKInteractor类的Initialize方法
void QVTKInteractor::Initialize()
{
this->Interactor->Initialize();
}
Initialize方法初始化交互器。
1.6 QVTKInteractor类的SetSize方法
void QVTKInteractor::SetSize(int width, int height)
{
this->Interactor->SetSize(width, height);
}
SetSize方法设置交互器大小。
1.7 QVTKInteractor类的SetRenderEnabled方法
void QVTKInteractor::SetRenderEnabled(bool renderEnabled)
{
this->RenderEnabled = renderEnabled;
}
SetRenderEnabled方法设置渲染是否启用。
1.8 QVTKInteractor类的GetRenderEnabled方法
bool QVTKInteractor::GetRenderEnabled()
{
return this->RenderEnabled;
}
GetRenderEnabled方法获取渲染是否启用。
1.9 QVTKInteractor类的StartInteraction方法
void QVTKInteractor::StartInteraction()
{
this->Interactor->Start();
}
StartInteraction方法启动交互。
1.10 QVTKInteractor类的EndInteraction方法
void QVTKInteractor::EndInteraction()
{
this->Interactor->End();
}
EndInteraction方法结束交互。
1.11 QVTKInteractor类的eventFilter方法
bool QVTKInteractor::eventFilter(QObject *object, QEvent *event) override
{
if (object == this->Parent() && event->type() == QEvent::Paint) {
if (this->RenderEnabled) {
this->Interactor->Render();
}
return true;
}
return false;
}
eventFilter方法是事件过滤器,它处理父对象的Paint事件。如果渲染是否启用为true,则调用Interactor->Render()方法渲染。
2 示例代码
#include <QVTKInteractor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkActor.h>
#include <vtkPolyDataMapper.h>
#include <vtkSphereSource.h>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// 创建一个渲染窗口
vtkRenderWindow *renWin = vtkRenderWindow::New();
// 创建一个渲染器
vtkRenderer *ren = vtkRenderer::New();
renWin->AddRenderer(ren);
// 创建一个球体源
vtkSphereSource *sphereSource = vtkSphereSource::New();
// 创建一个多边形数据映射器
vtkPolyDataMapper *mapper = vtkPolyDataMapper::New();
mapper->SetInputConnection(sphereSource->GetOutputPort());
// 创建一个演员
vtkActor *actor = vtkActor::New();
actor->SetMapper(mapper);
// 将演员添加到渲染器中
ren->AddActor(actor);
// 创建一个QVTK交互器
QVTKInteractor *interactor = new QVTKInteractor;
// 设置渲染窗口
interactor->SetRenderWindow(renWin);
// 设置交互器样式
interactor->SetInteractorStyle(vtkInteractorStyleTrackballCamera::New());
// 初始化交互器
interactor->Initialize();
// 创建一个窗口部件
QWidget *widget = new QWidget;
widget->setAttribute(Qt::WA_PaintOnScreen);
widget->installEventFilter(interactor);
// 将窗口部件添加到布局中
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(widget);
// 创建一个主窗口
QMainWindow *mainWindow = new QMainWindow;
mainWindow->setCentralWidget(widget);
mainWindow->show();
// 启动交互
interactor->StartInteraction();
return app.exec();
}
这段代码创建了一个vtkRenderWindow、一个vtkRenderer、一个vtkSphereSource、一个vtkPolyDataMapper、一个vtkActor和一个QVTKInteractor。然后将actor添加到渲染器中,将渲染器添加到渲染窗口中,将QVTKInteractor与渲染窗口关联,并将其添加到布局中。最后,创建了一个主窗口,将窗口部件添加到主窗口中,并显示主窗口。最后,启动交互。
当用户在窗口部件中移动鼠标时,vtkInteractorStyleTrackballCamera会自动旋转和缩放场景。
3 总结
BestMPRBaseVtk中的QVTKInteractor是一个Qt交互器,它允许用户与3D医学影像进行交互,如旋转、平移、缩放等。本文详细介绍了QVTKInteractor类的使用方法,并提供了一些示例代码来演示如何使用它。