QvtkWidget 和 vtkImageViewer2 改变default mouse interactorStyle

本文介绍了如何重载默认的vtkInteractorStyleTrackballCamera,创建自定义的MouseInteractorStyle,以改变QvtkWidget和vtkImageViewer2的鼠标交互事件,包括左键、中键、右键点击以及滚轮事件。同时,通过vtkEventQtSlotConnect连接VTK事件和Qt槽函数,实现特定的交互响应。在设置过程中,特别强调了SetRenderWindow和SetInteractor的顺序以及优先级设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

重载的vtkInteractorStyleTrackballCamera 也可以是子类 vtkInteractorImage. 同时要注意qvtk 与vtkImageViewer的 RenderWindow与Interactor的共享, 多以qvtk为准. SetInteractor 一定要在 SetRenderWindow之前, 以避免error出现.

 
"viewer.h"
// Overwrite default interaction style
class MouseInteractorStyle : public vtkInteractorStyleTrackballCamera
{
  public:
    static MouseInteractorStyle* New();
    vtkTypeMacro(MouseInteractorStyle, vtkInteractorStyleTrackballCamera);
    virtual void OnLeftButtonDown()
    {
      std::cout << "Pressed left mouse button." << std::endl;
      // Forward events
      // vtkInteractorStyleTrackballCamera::OnLeftButtonDown();
    }
    virtual void OnMiddleButtonDown()
    {
      std::cout << "Pressed middle mouse button." << std::endl;
      // Forward events
      // vtkInteractorStyleTrackballCamera::OnMiddleButtonDown();
    }
    virtual void OnRightButtonDown()
    {
      std::cout << "Pressed right mouse button." << std::endl;
      // Forward events
      // vtkInteractorStyleTrackballCamera::OnRightButtonDown();
    }
    virtual void OnMouseWheelForward()
    {
        std::cout << "Forward scroll mouse wheel." << std::endl;
        // Forward events
        // vtkInteractorStyleTrackballCamera::OnMouseWheelForward();
    }
    virtual void OnMouseWheelBackward()
    {
        std::cout << "Forward scroll mouse wheel." << std::endl;
        // Forward events
        // vtkInteractorStyleTrackballCamera::OnMouseWheelBackward();
    }
};


"viewer.cpp"

#define VTK_CREATE(type, name) \
  vtkSmartPointer<type> name = vtkSmartPointer<type>::New()
vtkStandardNewMacro(MouseInteractorStyle);


// QVtk objects
    this->render1 = vtkSmartPointer<vtkRenderer>::New();
    this->viewerAxial = vtkSmartPointer<vtkImageViewer2>::New();

 // Enable connections between VTK event and Qt slots
    //    VTK_CREATE(vtkEventQtSlotConnect, connection);
    connection = vtkSmartPointer<vtkEventQtSlotConnect>::New();
    // Setup mouse event, called before default vtkinteractor
    connection->Connect(this->ui->qvtkWidget_1->GetInteractor(),
                        vtkCommand::MouseWheelForwardEvent,
                        this,
                        SLOT(mouseWheelForwardCallback(vtkObject*,ulong,void*,void*,vtkCommand*)),
                        NULL,1.0);   // set priority
    connection->Connect(this->ui->qvtkWidget_1->GetInteractor(),
                        vtkCommand::MouseWheelBackwardEvent,
                        this,
                        SLOT(mouseWheelBackwardCallback(vtkObject*,ulong,void*,void*,vtkCommand*)),
                        NULL,1.0);   // set priority
    connection->Connect(this->ui->qvtkWidget_1->GetRenderWindow()->GetInteractor(),
                        vtkCommand::MouseMoveEvent,
                        this,
                        SLOT(animateSlider(vtkObject*)));
    connection->Connect(this->ui->qvtkWidget_1->GetInteractor(),
                        vtkCommand::LeftButtonPressEvent,
                        this,
                        SLOT(animateSlider(vtkObject*)));
    connection->PrintSelf(std::cout, vtkIndent());
//  Declare vtk renderwindow
    this->viewerAxial->SetInput(reader->GetOutput());
    this->viewerAxial->UpdateDisplayExtent();
    this->viewerAxial->SetupInteractor(this->ui->qvtkWidget_1->GetRenderWindow()->GetInteractor());
    //    this->viewerAxial->SetRenderWindow(this->ui->qvtkWidget_1->GetRenderWindow());
    this->ui->qvtkWidget_1->SetRenderWindow(this->viewerAxial->GetRenderWindow());
    // Disable deafult style
    this->ui->qvtkWidget_1->GetInteractor()->GetInteractorStyle()->EnabledOff();
    this->ui->qvtkWidget_1->GetInteractor()->Disable();
    VTK_CREATE(MouseInteractorStyle, interactorStyle);
    this->ui->qvtkWidget_1->GetInteractor()->SetInteractorStyle(interactorStyle);
    this->ui->qvtkWidget_1->GetInteractor()->Initialize();
    //    this->ui->qvtkWidget_1->GetInteractor()->Start();
    //    this->viewerAxial->SetRenderer(render1);
    this->viewerAxial->GetRenderer()->ResetCamera();
    //  Filp y axis
    this->viewerAxial->GetRenderer()->GetActiveCamera()->SetRoll(180.0);
    this->viewerAxial->SetSlice(10);
    this->viewerAxial->Render();

void Viewer::mouseWheelForwardCallback(vtkObject * obj, unsigned long,
                                       void * client_data, void *,
                                       vtkCommand * command)
{
    this->ui->verticalSlider_1->setValue(this->ui->verticalSlider_1->value()+1);
    UpdateWidget();
}
void Viewer::mouseWheelBackwardCallback(vtkObject * obj, unsigned long,
                                        void * client_data, void *,
                                        vtkCommand * command)
{
    this->ui->verticalSlider_1->setValue(this->ui->verticalSlider_1->value()-1);
    UpdateWidget();
}

### 集成 VTKImageViewer2 QVTKOpenGL 为了实现 `vtkImageViewer2` 与 `QVTKOpenGLWidget` 的集成,可以按照以下方法操作。这涉及到设置 Qt 应用程序环境并配置 OpenGL 上下文以支持 VTK 渲染。 #### 设置默认表面格式 在初始化 QApplication 前,需设定默认的表面格式来确保 OpenGL 环境适配于 VTK 使用: ```cpp #include <QApplication> #include <QSurfaceFormat> #include "QVTKOpenGLNativeWidget.h" int main(int argc, char *argv[]) { // 关闭全局警告显示 vtkObject::GlobalWarningDisplayOff(); // 设定默认的 OpenGL 表面格式 QSurfaceFormat::setDefaultFormat(QVTKOpenGLNativeWidget::defaultFormat()); QApplication app(argc, argv); ImageView viewer; viewer.show(); return app.exec(); } ``` 此部分代码关闭了 VTK 的全局警告提示,并设置了适合 VTK 的 OpenGL 格式[^3]。 #### 创建自定义窗口部件 接下来,在继承自 `QWidget` 或其他适当基类的新类中实例化 `QVTKOpenGLWidget` 并关联至 `vtkImageViewer2` 实例: ```cpp class ImageView : public QWidget { public: explicit ImageView(QWidget* parent = nullptr); private: void setupUi(); }; ImageView::ImageView(QWidget* parent) : QWidget(parent), ui(new Ui::ImageView()) { setupUi(); } void ImageView::setupUi() { auto layout = new QVBoxLayout(this); auto widget = new QVTKOpenGLWidget(this); m_imageViewer = vtkSmartPointer<vtkImageViewer2>::New(); m_imageViewer->SetRenderWindow(widget->renderWindow()); m_imageViewer->SetupInteractor(widget->interactor()); layout->addWidget(widget); } ``` 这段代码展示了如何构建一个包含 `QVTKOpenGLWidget` 的界面组件,并将其渲染窗口交互器分配给新的 `vtkImageViewer2` 对象[^1]。 #### 加载图像数据 最后一步是加载要查看的数据集到 `vtkImageViewer2` 中去展示: ```cpp // Load your data here... auto reader = vtkSmartPointer<vtkDICOMImageReader>::New(); reader->SetDirectoryName("/path/to/dicom/files"); reader->Update(); m_imageViewer->SetInputConnection(reader->GetOutputPort()); m_imageViewer->Render(); ``` 上述片段说明了怎样读取 DICOM 文件作为输入源,并传递给 `vtkImageViewer2` 进行可视化处理[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值