Qt获取VTK右键点击信号

22 篇文章 69 订阅

利用vtkEventQtSlotConnect可以实现Qt和VTK交互,一般在Qt中使用VTK,用的是QVTKWidget(太老了建议不要使用),QVTKOpenGLNaiveWidget等封装了VTK功能的Qt控件,基类为QWidget,可加入Qt的布局中。

QVTKDemo.h

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_QVTKDemo.h"

#include <QPointer>
#include <vtkSmartPointer.h>
#include <vtkObject.h>

class QVTKWidget;
class vtkEventQtSlotConnect;


class QVTKDemo : public QMainWindow
{
    Q_OBJECT

public:
    QVTKDemo(QWidget *parent = Q_NULLPTR);

public slots:
	void slot_clicked(vtkObject*, unsigned long, void*, void*);

private:
    Ui::QVTKDemoClass ui;

    QPointer<QVTKWidget> vtkWidget;
    vtkSmartPointer<vtkEventQtSlotConnect> Connections;
};

QVTKDemo.cpp

#include "QVTKDemo.h"

#include <vtkPolyDataReader.h>
#include <vtkSTLReader.h>
#include <vtkPolyData.h>
#include <vtkDataSet.h>
#include <vtkPointData.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderWindow.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkSmartPointer.h>
#include <vtkActor.h>
#include <vtkCubeSource.h>
#include <vtkEventQtSlotConnect.h>

#include <QVTKWidget.h>
#include <QMenu>
#include <QAction>
#include <QPointer>

#include "vtkAutoInit.h" 
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
VTK_MODULE_INIT(vtkRenderingFreeType);


QVTKDemo::QVTKDemo(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

	Connections = vtkSmartPointer<vtkEventQtSlotConnect>::New();
	vtkWidget = new QVTKWidget(this);

	vtkSmartPointer<vtkCubeSource> cube = vtkSmartPointer<vtkCubeSource>::New();
	cube->SetXLength(10);
	cube->SetYLength(10);
	cube->SetZLength(5);

	vtkSmartPointer <vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	mapper->SetInputConnection(cube->GetOutputPort());

	vtkSmartPointer <vtkActor> actor = vtkSmartPointer<vtkActor>::New();
	actor->SetMapper(mapper);
	vtkSmartPointer<vtkRenderer> ren1 = vtkSmartPointer<vtkRenderer>::New();

	ren1->AddActor(actor);
	ren1->SetBackground(0.1, 0.2, 0.4);

	vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
	renWin->AddRenderer(ren1);
	// renWin->SetSize(300, 300);

	vtkWidget->SetRenderWindow(renWin);

	setCentralWidget(vtkWidget);

	this->Connections->Connect(
		vtkWidget->GetRenderWindow()->GetInteractor(),
		vtkCommand::RightButtonPressEvent, this,
		SLOT(slot_clicked(vtkObject*, unsigned long, void*, void*)));

}

void QVTKDemo::slot_clicked(vtkObject*, unsigned long, void*,void*) 
{
	QPointer<QMenu> menu = new QMenu(this);
	auto ac_1 = new QAction("Test1", this);
	auto ac_2 = new QAction("Test2", this);
	menu->addAction(ac_1);
	menu->addAction(ac_2);
	menu->exec(QCursor::pos());

    vtkWidget->GetRenderWindow()->GetInteractor()->RightButtonReleaseEvent();
}

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
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`函数中,我们可以根据鼠标点击的位置进行相应的操作。 请注意,上述代码只是一个简单示例,实际使用时可能需要根据具体需求进行修改和扩展。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值