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());