求大神,vtk和Qt混合的例子,出错

[复制链接]
查看11 | 回复4 | 2021-1-27 06:36:19 | 显示全部楼层 |阅读模式
vtkMyCallback.h
#ifndefVTKMYCALLBACK_H
#defineVTKMYCALLBACK_H
#include
#include
#include
#include
#include
#include
#include
#include
#include
classvtkMyCallback:publicvtkCommand
{
friendclasszymainwindow;
public:
staticvtkMyCallback*New()
{
returnnewvtkMyCallback;
}
virtualvoidExecute(vtkObject*caller,unsignedlongeventId,void*callData);
voidPickerInteractionCallback(vtkObject*vtkNotUsed(object),unsignedlongevent,void*clientdata,void*vtkNotUsed(calldata));
vtkTextMapper*textMapper;
vtkActor2D*textActor;
vtkCellPicker*picker;
vtkRenderWindow*renwin;
vtkRenderWindowInteractor*iren;
vtkRenderer*ren1;
intmouseMotion;
};
#endif
vtkMyCallback.cpp
#include"vtkMyCallback.h"
voidvtkMyCallback::Execute(vtkObject*caller,unsignedlongeventId,void*callData)
{
if(picker->GetCellId()VisibilityOff();
}
else
{
doubleselpot[3];
picker->GetSelectionPoint(selpot);
doublex=selpot[0];
doubley=selpot[1];
doublepickpos[3];
picker->GetPickPosition(pickpos);
doublexp=pickpos[0];
doubleyp=pickpos[1];
doublezp=pickpos[2];
chartext[120];
sprintf(text,"(%5.5f,%5.5f,%5.5f)",xp,yp,zp);
textMapper->SetInput(text);
textActor->SetPosition(x,y);
textActor->VisibilityOn();
}
}
voidvtkMyCallback::PickerInteractionCallback(vtkObject*vtkNotUsed,unsignedlongevent,void*clientdata,void*vtkNotUsed(calldata))
{
vtkInteractorStyleTrackballCamera*style=(vtkInteractorStyleTrackballCamera*)clientdata;
switch(event)
{
casevtkCommand::LeftButtonPressEvent:
mouseMotion=0;
style->OnLeftButtonDown();
break;
casevtkCommand::LeftButtonReleaseEvent:
if(mouseMotion==0)
{
int*pick=iren->GetEventPosition();
picker->Pick(double(pick[0]),double(pick[1]),0.0,ren1);
}
style->OnLeftButtonUp();
break;
casevtkCommand::MouseMoveEvent:
mouseMotion=1;
style->OnMouseMove();
break;
}
}
zymainwindow.h
#ifndefZYMAINWINDOW_H
#defineZYMAINWINDOW_H
#include
#include"ui_zymainwindow.h"
#include
#include"vtkMyCallback.h"
#include"zymainwindow.h"
classzymainwindow:publicQMainWindow
{
Q_OBJECT
public:
zymainwindow(QWidget*parent=0,Qt::WFlagsflags=0);
~zymainwindow();
private:
Ui::zymainwindowClassui;
QVTKWidget*widget;
};
#endif//ZYMAINWINDOW_H

zymainwindow.cpp
#include"zymainwindow.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
zymainwindow::zymainwindow(QWidget*parent,Qt::WFlagsflags)
:QMainWindow(parent,flags)
{
ui.setupUi(this);
//vtkRenderWindow*renWin=vtkRenderWindow::New();
vtkSphereSource*source=vtkSphereSource::New();
vtkPolyDataMapper*sphereMapper=vtkPolyDataMapper::New();
sphereMapper->SetInput(source->GetOutput());
vtkActor*sphereActor=vtkActor::New();
sphereActor->SetMapper(sphereMapper);
vtkMyCallback*pickObserver=vtkMyCallback::New();
pickObserver->mouseMotion=0;
pickObserver->picker=vtkCellPicker::New();
pickObserver->picker->AddObserver(vtkMyCallback::EndEvent,pickObserver);
pickObserver->textMapper=vtkTextMapper::New();
vtkTextProperty*textProperty=pickObserver->textMapper->GetTextProperty();
textProperty->SetFontFamilyToArial();
textProperty->SetFontSize(12);
textProperty->BoldOn();
textProperty->SetColor(1,0,0);
pickObserver->textActor=vtkActor2D::New();
pickObserver->textActor->VisibilityOff();
pickObserver->textActor->SetMapper(pickObserver->textMapper);
vtkInteractorStyleTrackballCamera*style=vtkInteractorStyleTrackballCamera::New();
vtkCallbackCommand*pickCommand=vtkCallbackCommand::New();
pickCommand->SetClientData(style);
pickCommand->SetCallback(PickerInteractionCallback);
style->AddObserver(vtkCommand::LeftButtonPressEvent,pickCommand);
style->AddObserver(vtkCommand::LeftButtonReleaseEvent,pickCommand);
style->AddObserver(vtkCommand::MouseMoveEvent,pickCommand);
pickObserver->ren1=vtkRenderer::New();
pickObserver->renwin=vtkRenderWindow::New();
pickObserver->renwin->AddRenderer(pickObserver->ren1);
QVTKWidget*widget=newQVTKWidget;
widget->SetRenderWindow(pickObserver->renwin);
this->setCentralWidget(widget);
pickObserver->iren=vtkRenderWindowInteractor::New();
pickObserver->iren->SetInteractorStyle(style);
pickObserver->iren->SetPicker(pickObserver->picker);
pickObserver->ren1->AddActor2D(pickObserver->textActor);
pickObserver->ren1->AddActor(sphereActor);
pickObserver->ren1->SetBackground(1,1,1);
vtkCamera*cam1=pickObserver->ren1->GetActiveCamera();
cam1->Zoom(1.4);
pickObserver->iren->Initialize();
pickObserver->iren->Start();
pickObserver->picker->RemoveObserver(pickObserver);
}
zymainwindow::~zymainwindow()
{
}

main.cpp
#include"zymainwindow.h"
#include
intmain(intargc,char*argv[])
{
QApplicationa(argc,argv);
zymainwindoww;
w.show();
returna.exec();
}
错误是:1>.\zymainwindow.cpp(40):errorC2065:“PickerInteractionCallback”:未声明的标识符。
刚学的菜鸟求大神解救啊!!!!!!!
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:36:19 | 显示全部楼层
引用楼主czdxzy的回复:vtkMyCallback.h
#ifndefVTKMYCALLBACK_H
#defineVTKMYCALLBACK_H
#include
#include
#include
#include
#include
#include
#include
#include
#include
classvtkMyCallback:publicvtkCommand
{
friendclasszymainwindow;
public:
staticvtkMyCallback*New()
{
returnnewvtkMyCallback;
}
virtualvoidExecute(vtkObject*caller,unsignedlongeventId,void*callData);
voidPickerInteractionCallback(vtkObject*vtkNotUsed(object),unsignedlongevent,void*clientdata,void*vtkNotUsed(calldata));
vtkTextMapper*textMapper;
vtkActor2D*textActor;
vtkCellPicker*picker;
vtkRenderWindow*renwin;
vtkRenderWindowInteractor*iren;
vtkRenderer*ren1;
intmouseMotion;
};
#endif
vtkMyCallback.cpp
#include"vtkMyCallback.h"
voidvtkMyCallback::Execute(vtkObject*caller,unsignedlongeventId,void*callData)
{
if(picker->GetCellId()VisibilityOff();
}
else
{
doubleselpot[3];
picker->GetSelectionPoint(selpot);
doublex=selpot[0];
doubley=selpot[1];
doublepickpos[3];
picker->GetPickPosition(pickpos);
doublexp=pickpos[0];
doubleyp=pickpos[1];
doublezp=pickpos[2];
chartext[120];
sprintf(text,"(%5.5f,%5.5f,%5.5f)",xp,yp,zp);
textMapper->SetInput(text);
textActor->SetPosition(x,y);
textActor->VisibilityOn();
}
}
voidvtkMyCallback::PickerInteractionCallback(vtkObject*vtkNotUsed,unsignedlongevent,void*clientdata,void*vtkNotUsed(calldata))
{
vtkInteractorStyleTrackballCamera*style=(vtkInteractorStyleTrackballCamera*)clientdata;
switch(event)
{
casevtkCommand::LeftButtonPressEvent:
mouseMotion=0;
style->OnLeftButtonDown();
break;
casevtkCommand::LeftButtonReleaseEvent:
if(mouseMotion==0)
{
int*pick=iren->GetEventPosition();
picker->Pick(double(pick[0]),double(pick[1]),0.0,ren1);
}
style->OnLeftButtonUp();
break;
casevtkCommand::MouseMoveEvent:
mouseMotion=1;
style->OnMouseMove();
break;
}
}
zymainwindow.h
#ifndefZYMAINWINDOW_H
#defineZYMAINWINDOW_H
#include
#include"ui_zymainwindow.h"
#include
#include"vtkMyCallback.h"
#include"zymainwindow.h"
classzymainwindow:publicQMainWindow
{
Q_OBJECT
public:
zymainwindow(QWidget*parent=0,Qt::WFlagsflags=0);
~zymainwindow();
private:
Ui::zymainwindowClassui;
QVTKWidget*widget;
};
#endif//ZYMAINWINDOW_H

zymainwindow.cpp
#include"zymainwindow.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
zymainwindow::zymainwindow(QWidget*parent,Qt::WFlagsflags)
:QMainWindow(parent,flags)
{
ui.setupUi(this);
//vtkRenderWindow*renWin=vtkRenderWindow::New();
vtkSphereSource*source=vtkSphereSource::New();
vtkPolyDataMapper*sphereMapper=vtkPolyDataMapper::New();
sphereMapper->SetInput(source->GetOutput());
vtkActor*sphereActor=vtkActor::New();
sphereActor->SetMapper(sphereMapper);
vtkMyCallback*pickObserver=vtkMyCallback::New();
pickObserver->mouseMotion=0;
pickObserver->picker=vtkCellPicker::New();
pickObserver->picker->AddObserver(vtkMyCallback::EndEvent,pickObserver);
pickObserver->textMapper=vtkTextMapper::New();
vtkTextProperty*textProperty=pickObserver->textMapper->GetTextProperty();
textProperty->SetFontFamilyToArial();
textProperty->SetFontSize(12);
textProperty->BoldOn();
textProperty->SetColor(1,0,0);
pickObserver->textActor=vtkActor2D::New();
pickObserver->textActor->VisibilityOff();
pickObserver->textActor->SetMapper(pickObserver->textMapper);
vtkInteractorStyleTrackballCamera*style=vtkInteractorStyleTrackballCamera::New();
vtkCallbackCommand*pickCommand=vtkCallbackCommand::New();
pickCommand->SetClientData(style);
pickCommand->SetCallback(PickerInteractionCallback);
style->AddObserver(vtkCommand::LeftButtonPressEvent,pickCommand);
style->AddObserver(vtkCommand::LeftButtonReleaseEvent,pickCommand);
style->AddObserver(vtkCommand::MouseMoveEvent,pickCommand);
pickObserver->ren1=vtkRenderer::New();
pickObserver->renwin=vtkRenderWindow::New();
pickObserver->renwin->AddRenderer(pickObserver->ren1);
QVTKWidget*widget=newQVTKWidget;
widget->SetRenderWindow(pickObserver->renwin);
this->setCentralWidget(widget);
pickObserver->iren=vtkRenderWindowInteractor::New();
pickObserver->iren->SetInteractorStyle(style);
pickObserver->iren->SetPicker(pickObserver->picker);
pickObserver->ren1->AddActor2D(pickObserver->textActor);
pickObserver->ren1->AddActor(sphereActor);
pickObserver->ren1->SetBackground(1,1,1);
vtkCamera*cam1=pickObserver->ren1->GetActiveCamera();
cam1->Zoom(1.4);
pickObserver->iren->Initialize();
pickObserver->iren->Start();
pickObserver->picker->RemoveObserver(pickObserver);
}
zymainwindow::~zymainwindow()
{
}

main.cpp
#include"zymainwindow.h"
#include
intmain(intargc,char*argv[])
{
QApplicationa(argc,argv);
zymainwindoww;
w.show();
returna.exec();
}
错误是:1>.\zymainwindow.cpp(40):errorC2065:“PickerInteractionCallback”:未声明的标识符。
刚学的菜鸟求大神解救啊!!!!!!!

pickCommand->SetCallback(PickerInteractionCallback);这句中的PickerInteractionCallback这个从哪里来的?没明白,你是想调用vtkMyCallback类中的PickerInteractionCallback函数??
回复

使用道具 举报

千问 | 2021-1-27 06:36:19 | 显示全部楼层
就是这个意思
回复

使用道具 举报

千问 | 2021-1-27 06:36:19 | 显示全部楼层
引用2楼czdxzy的回复:就是这个意思

也不是你这样调用的,
你要调用那个函数的话,你先包含上面那个类的头文件,然后定义一个对象,这样就可以操作PickerInteractionCallback这个函数了,或者你在zymainwindow类设置一个接口函数,将PickerInteractionCallback需要要的参数传进去,然后在vtkMyCallback类中对接口函数进行操作,里面调用PickerInteractionCallback函数,就好了,
回复

使用道具 举报

千问 | 2021-1-27 06:36:19 | 显示全部楼层
如果通过定义对象调用的话,那个PickerInteractionCallback里面的参数怎么写啊?我看网上有一个例子就没有实例化这个函数啊,可不可以将vtkCallbackCommand声明为vtkMyCallback的友元类来调用呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行