返回

BestMPRBaseVtk Qt交互器QVTKInteractor详解

前端

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类的使用方法,并提供了一些示例代码来演示如何使用它。