https://blog.csdn.net/learn_sunzhuli/article/details/45830797

看的是这个博客,用的是vtkcommand.有这个需要的可以看看,我用的不是这个,但是借鉴了一下。

Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->resize(800,800);
   
    //ini
    qvtkWidgetLeft = new QVTKWidget(this);
  

   viewer =vtkSmartPointer<vtkImageViewer2>::New();
    viewer->SetInputData(reader->GetOutput());
    viewer->SetSliceOrientationToXY();
    viewer->GetRenderer()->SetBackground(1,1,1);
    
    vtkSmartPointer<vtkRenderWindowInteractor> rwi = vtkSmartPointer<vtkRenderWindowInteractor>::New();
   
    vtkSmartPointer<MyInteractor> style = vtkSmartPointer<MyInteractor>::New();
    style->SetOriImage(reader->GetOutput());
    style->SetViewer(viewer);
    style->SetDim(dims);
    style->SetVtkWidget(qvtkWidgetLeft);
    rwi->SetInteractorStyle( style );
    
    viewer->GetRenderer()->ResetCamera();
    qvtkWidgetLeft->SetRenderWindow(viewer->GetRenderWindow()); //先设置window
    qvtkWidgetLeft->GetRenderWindow()->SetInteractor(rwi);      //再设置window的交互
    qvtkWidgetLeft->GetRenderWindow()->Render();
    
}

Widget::~Widget()
{
    delete ui;

}

class MyInteractor : public vtkInteractorStyleTrackballCamera
{
protected:
    vtkImageViewer2 *Viewer;
   
    static int CurrentSliceNum ;
    int SliceNum ;
    int  Dim[3];
    QVTKWidget* qvtkWidgetLeft;
   
public:
    static MyInteractor* New();
    vtkTypeMacro(MyInteractor, vtkInteractorStyleTrackballCamera);
    
  
    void SetVtkWidget(  QVTKWidget* vtkWidget)
    {
        qvtkWidgetLeft = vtkWidget;
    }
  
    
    void SetViewer(vtkImageViewer2 *viewer)
    {
        this->Viewer = viewer;
    }
   
    void SetDim(int dim[3])
    {
        Dim[0] = dim[0];Dim[1] = dim[1];Dim[2] = dim[2];
        SliceNum = Dim[2];
    }
  
    FastMarchingFilterType::Pointer  fastMarching = FastMarchingFilterType::New();
    NodeType node;
    vtkSmartPointer<vtkRegularPolygonSource> polygonSource = vtkSmartPointer<vtkRegularPolygonSource>::New();
    void OnMouseWheelForward() override
    {
        //+
        if(CurrentSliceNum < SliceNum)
            CurrentSliceNum++;
        this->Viewer->SetSlice(CurrentSliceNum);
        this->Viewer->GetRenderer()->ResetCamera();//need,必须有这个
        qvtkWidgetLeft->GetRenderWindow()->Render();
      
    }
    void OnMouseWheelBackward() override
    {
        //-
        if(CurrentSliceNum >0)
            CurrentSliceNum--;
        this->Viewer->SetSlice(CurrentSliceNum);
        this->Viewer->GetRenderer()->ResetCamera();//need,必须有这个
        qvtkWidgetLeft->GetRenderWindow()->Render();
      
    }
    
    ~MyInteractor(){ }
};
vtkStandardNewMacro(MyInteractor);
int MyInteractor::CurrentSliceNum = 0 ;//must initialize  outside of the class



    
 
  

多说一句:因为我上面用到的是自己定义的style,所以设置交互的时候是这样的:

  qvtkWidgetLeft->SetRenderWindow(viewer->GetRenderWindow()); //先设置window
  qvtkWidgetLeft->GetRenderWindow()->SetInteractor(rwi);      //再设置window的交互

 如果你用的是默认的交互方式,按下面这样的:

viewer->SetupInteractor(qVTK->GetRenderWindow()->GetInteractor()); 
qVTK->SetRenderWindow(viewer->GetRenderWindow());

 

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐