qt+vtk读取cgns文件并显示在控件中

版本是qt5+vtk9.2


#include "mainwindow.h"
#include "ui_mainwindow.h"
//#include <vtkAutoInit.h>
//VTK_MODULE_INIT(vtkRenderingOpenGL2)
//VTK_MODULE_INIT(vtkInteractionStyle)
#include <iostream>
#include "vtkCGNSReader.h"
#include "vtkCGNSFileSeriesReader.h"
#include "vtkCell.h"
#include "vtkMultiBlockDataSet.h"

using namespace std;
#include "vtkNew.h"
#include "vtkStructuredGrid.h"
#include "vtkUnstructuredGrid.h"
#include "vtkTestUtilities.h"
#include "vtkCompositeDataGeometryFilter.h"
#include "vtkGeometryFilter.h"
#include "vtkPolyDataMapper.h"
#include "vtkDataSetMapper.h"
#include "vtkActor.h"
#include "vtkAssembly.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkInteractorStyleTrackballCamera.h"
#include "vtkDataArraySelection.h"
#include "vtkExtractBlock.h"
#include "vtkExtractArray.h"
#include "vtkInformation.h"
#include "vtkPolyDataWriter.h"
#include "vtkDataSetWriter.h"
#include "vtkDataObjectTree.h"
#include "vtkExtractBlock.h"
#include "vtkCompositeDataWriter.h"
#include <vtkMultiProcessController.h>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    ui->qvtkwidget->interactor()->SetRenderWindow(nullptr);
    ui->qvtkwidget->interactor()->SetInteractorStyle(nullptr);
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
        vtkSmartPointer<vtkCGNSReader> reader = vtkSmartPointer<vtkCGNSReader>::New();
        reader->SetFileName("test.cgns");
        reader->Update();
        vtkNew<vtkCompositeDataGeometryFilter> geom;
        geom->SetInputConnection(reader->GetOutputPort());
        geom->Update();
        vtkNew<vtkDataSetMapper> modelmapper;
        modelmapper->SetInputConnection(geom->GetOutputPort());
        vtkNew<vtkActor> modelActor;
        modelActor->SetMapper(modelmapper);
        vtkNew<vtkAssembly> assembly;
        assembly->AddPart(modelActor);
        vtkNew<vtkRenderer> render;
        render->AddActor(assembly);
        render->SetBackground(160.0 / 255.0, 163.0 / 255.0, 228.0 / 255.0);
        ui->qvtkwidget->renderWindow()->AddRenderer(render);
        ui->qvtkwidget->renderWindow()->SetMultiSamples(0);
        vtkNew<vtkInteractorStyleTrackballCamera> style;
        ui->qvtkwidget->interactor()->SetInteractorStyle(style);
        ui->qvtkwidget->renderWindow()->Render();
}

参考了https://zhuanlan.zhihu.com/p/377473099?utm_id=0,删除不必要的内容,改为qt代码

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值