我想連接一個VTK
回調到Qt
插槽,所以當回調發生時,插槽將被觸發。連接一個VTK回調Qt插槽
我正在使用QVTKWidget
來呈現已添加到PCLVisualizer
(來自點雲庫PCL)的點雲。
讓我們展示一些代碼:
PointCloud.h
class PointCloud: public QObject {
Q_OBJECT
private:
static void loadStartCallback(
vtkObject *caller,
unsigned long eventId,
void *clientData,
void *callData
);
static void loadEndCallback(
vtkObject *caller,
unsigned long eventId,
void *clientData,
void *callData
);
void load(void);
// more funcs and methods
private:
QVTKWidget* widget;
pcl::visualization::PCLVisualizer* visualizer;
unsinged long observerStartTag;
unsinged long observerEndTag;
// more attributes
}
PointCloud.cpp
void PointCloud::loadStartCallback(
vtkObject* caller,
unsigned long eventId,
void* clientData,
void* callData
) {
qDebug() << "\t\tPointCloud - loadCallback started\n";
if(clientData) {
PointCloud* self = reinterpret_cast<PointCloud*>(clientData);
self->widget->GetRenderWindow()->RemoveObserver(self->observerStartTag);
}
void PointCloud::loadEndCallback(
vtkObject* caller,
unsigned long eventId,
void* clientData,
void* callData
) {
qDebug() << "\t\tPointCloud - loadCallback ended\n";
if(clientData) {
PointCloud* self = reinterpret_cast<PointCloud*>(clientData);
self->widget->GetRenderWindow()->RemoveObserver(self->observerEndTag);
}
}
void load(void) {
vtkSmartPointer<vtkRenderWindow> renderWindow = visualizer->getRenderWindow();
vtkSmartPointer<vtkCallbackCommand> startCallback = vtkSmartPointer<vtkCallbackCommand>::New();
startCallback->SetCallback(loadStartCallback);
startCallback->SetClientData(this);
observerStartTag = renderWindow->AddObserver(vtkCommand::StartEvent, startCallback);
vtkSmartPointer<vtkCallbackCommand> endCallback = vtkSmartPointer<vtkCallbackCommand>::New();
endCallback->SetCallback(loadEndCallback);
endCallback->SetClientData(this);
observerEndTag = renderWindow->AddObserver(vtkCommand::EndEvent, endCallback);
// more processing. local_cloud is already populated
// and functional at this point
widget->SetRenderWindow(renderWindow);
visualizer->addPointCloud<pcl::PointXYZ>(local_cloud, "local_cloud");
widget->Show();
widget->Update();
}
這種運作良好,一旦雲渲染開始時,點雲 - 打印loadCallback開始打印並w當渲染結束並顯示雲時,消息PointCloud - loadCallback結束被打印。
現在,除了打印結束消息之外,我還想觸發Qt
插槽。我試圖使用vtkEventQtSlotConnect
類是,因爲它似乎是回調連接插槽正確的選擇:在PointCloud.h
private slots:
void test(void);
新的PointCloud.cpp
新
void PointCloud::test(void) { qDebug() << "\t\tThis is a test\n; }
添加入點雲::負載(),在調用之前visualizer-> addPointCloud
vtkEventQtSlotConnect* vtk_qt_connector = vtkEventQtSlotConnect::New();
vtk_qt_connector->Connect(
renderWindow,
vtkCommand::EndEvent,
this,
SLOT(test(void)),
0,
1.0
);
// AFTER widget->Update()
vtk_qt_connector->Disconnect(); // NO PARAM: disconnects ALL slots
vtk_qt_connector->Delete();
} // End of PointCloud::load()
有了這些添加,在回調的消息被打印出來,但從未示出的test()
槽內的消息。
任何想法我做錯了什麼?
編輯
在VTK
例子回調,我已經看到,一個vtkRendeWindowInteractor
用於管理回調。但是,如果我將回調觀察者添加到它,它不如直接將其添加到渲染窗口準確。