VTK mouse event -- 捕捉鼠标动作并发送信号:vtkCommand
头文件申明:
#pragma once
#include <QObject>
#include <vtkCallbackCommand.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSmartPointer.h>
class MyMouseCallback : public QObject, public vtkCommand {
Q_OBJECT
signals:
void leftButtonPressed(int x, int y);
void rightButtonPressed(int x, int y);
public:
vtkTypeMacro(MyMouseCallback, vtkCommand);
static vtkSmartPointer<MyMouseCallback> New();
void Execute(vtkObject *p_caller, unsigned long p_event_id, void *p_call_data) override;
};
cpp文件
#include <QDebug>
#include "vtk_mouse_events.h"
vtkSmartPointer<MyMouseCallback> MyMouseCallback::New() { return new MyMouseCallback; }
void MyMouseCallback::Execute(vtkObject *p_caller, unsigned long p_event_id, void *p_call_data) {
if (p_event_id == vtkCommand::LeftButtonPressEvent) {
auto *interactor = static_cast<vtkRenderWindowInteractor *>(p_caller);
const int x = interactor->GetEventPosition()[0];
const int y = interactor->GetEventPosition()[1];
emit leftButtonPressed(x, y);
} else if (p_event_id == vtkCommand::RightButtonPressEvent) {
auto *interactor = static_cast<vtkRenderWindowInteractor *>(p_caller);
const int x = interactor->GetEventPosition()[0];
const int y = interactor->GetEventPosition()[1];
emit rightButtonPressed(x, y);
}
}
#if 0
int main(int, char *[]) {
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
interactor->SetRenderWindow(renderWindow);
// Create and set up a custom callback
MyMouseCallback *myCallback = MyMouseCallback::New();
// Connect the signal to a lambda function that handles the event
QObject::connect(myCallback, &MyMouseCallback::leftButtonPressed, [](int x, int y) {
qDebug() << "Left mouse button pressed at (" << x << ", " << y << ")";
// Do something with the coordinates in the lambda function
});
interactor->AddObserver(vtkCommand::LeftButtonPressEvent, myCallback);
renderWindow->Render();
interactor->Start();
return 0;
}
#endif
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构