QT+VTK实现鼠标位置输出

#include "QT_Demo.h"

QString path = "C:\\Users\\C230524\\Desktop\\QT_Demo\\x64\\Debug\\engine.ply";

QT_Demo::QT_Demo(QWidget* parent): QMainWindow(parent)
{
	//窗体初始化
	ui.setupUi(this);

	connect(ui.pushButton, &QPushButton::pressed, this, &QT_Demo::push_Clicked);
	//connect(ui.pushButton, SIGNAL(triggered()), this, SLOT(push_Clicked()));
}

QT_Demo::~QT_Demo()
{
}

void QT_Demo::push_Clicked()
{
	//读取模型
	vtkSmartPointer<vtkPLYReader> read = vtkSmartPointer<vtkPLYReader>::New();
	read->SetFileName(path.toUtf8());
	read->Update();
	//建立管线
	vtkSmartPointer<vtkPolyDataMapper> cylinderMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	cylinderMapper->SetInputData(read->GetOutput());
	cylinderMapper->Update();
	//Actor
	vtkSmartPointer<vtkActor> cylinderActor = vtkSmartPointer<vtkActor>::New();
	cylinderActor->SetMapper(cylinderMapper);
	//场景
	vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
	renderer->AddActor(cylinderActor);
	renderer->SetBackground(0.1, 0.2, 0.4);
	//场景交互
	vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
	//VTK事件触发QT槽
	vtkSmartPointer<vtkEventQtSlotConnect> slot = vtkSmartPointer<vtkEventQtSlotConnect>::New();
	slot->Connect(interactor, vtkCommand::MouseMoveEvent, this, SLOT(onMouse(vtkObject*)));
	//交互方式
	vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
	interactor->SetInteractorStyle(style);
	//渲染
	ui.VtkWindow->renderWindow()->AddRenderer(renderer);
	ui.VtkWindow->renderWindow()->SetInteractor(interactor);
	ui.VtkWindow->renderWindow()->Render();

	interactor->Initialize();
	interactor->Start();
	//清空
	cylinderMapper->Delete();
	cylinderActor->Delete();
	renderer->Delete();
	read->Delete();
	slot->Delete();
}

void QT_Demo::onMouse(vtkObject* obj)
{
	vtkRenderWindowInteractor* intactor = vtkRenderWindowInteractor::SafeDownCast(obj);

	int event_points[2];
	intactor->GetEventPosition(event_points);

	QString str;
	str.sprintf("X=%d:Y=%d", event_points[0], event_points[1]);
	ui.statusBar->showMessage(str);
}

请添加图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Qt中使用VTK库,可以实现VTK的可视化功能,并且可以通过Qt的事件机制来处理鼠标点击事件。下面是一个简单的示例代码,演示了如何在VTK中处理鼠标左键点击事件: 首先,需要在Qt中创建一个VTK窗口,并将其作为一个QWidget的子类来使用。然后,通过重写QWidget的鼠标事件函数来处理鼠标点击事件。 ```cpp #include <QVTKWidget.h> #include <vtkRenderWindow.h> #include <vtkRenderer.h> #include <vtkRenderWindowInteractor.h> #include <vtkSmartPointer.h> #include <vtkCommand.h> class MyVTKWidget : public QVTKWidget { public: MyVTKWidget(QWidget* parent = nullptr) : QVTKWidget(parent) { // 创建VTK渲染器和交互器 renderer = vtkSmartPointer<vtkRenderer>::New(); interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); interactor->SetRenderWindow(GetRenderWindow()); GetRenderWindow()->AddRenderer(renderer); // 设置交互器样式为默认样式 interactor->SetInteractorStyle(vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New()); // 添加鼠标左键点击事件监听器 vtkSmartPointer<MouseClickListener> clickListener = vtkSmartPointer<MouseClickListener>::New(); clickListener->SetVTKWidget(this); interactor->AddObserver(vtkCommand::LeftButtonPressEvent, clickListener); } private: vtkSmartPointer<vtkRenderer> renderer; vtkSmartPointer<vtkRenderWindowInteractor> interactor; class MouseClickListener : public vtkCommand { public: static MouseClickListener* New() { return new MouseClickListener; } void SetVTKWidget(MyVTKWidget* widget) { vtkWidget = widget; } virtual void Execute(vtkObject* caller, unsigned long eventId, void* callData) { if (eventId == vtkCommand::LeftButtonPressEvent) { // 处理鼠标左键点击事件 vtkRenderWindowInteractor* interactor = static_cast<vtkRenderWindowInteractor*>(caller); int* pos = interactor->GetEventPosition(); // 在这里可以根据鼠标点击的位置进行相应的操作 // 输出鼠标点击的位置 std::cout << "Mouse left button clicked at position: " << pos[0] << ", " << pos[1] << std::endl; } } private: MyVTKWidget* vtkWidget; }; }; int main(int argc, char** argv) { QApplication app(argc, argv); // 创建一个Qt窗口 QWidget window; window.resize(800, 600); // 创建一个VTK窗口,并将其添加到Qt窗口中 MyVTKWidget vtkWidget(&window); vtkWidget.resize(800, 600); window.show(); return app.exec(); } ``` 在上述代码中,我们创建了一个名为`MyVTKWidget`的类,继承自`QVTKWidget`,并重写了鼠标事件函数`Execute`。在`MyVTKWidget`的构造函数中,我们创建了VTK渲染器和交互器,并将其与VTK窗口关联起来。然后,我们创建了一个名为`MouseClickListener`的内部类,继承自`vtkCommand`,用于处理鼠标左键点击事件。在`MouseClickListener`的`Execute`函数中,我们可以根据鼠标点击的位置进行相应的操作。 请注意,上述代码只是一个简单示例,实际使用时可能需要根据具体需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cheng先生啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值