C#通过Qt使用VTK

需求:

一个项目,界面是C# 开发的,但是业务上有三维可视化的需求,VTK基于C#的绑定版本需要收费,并且资料很少。因此将VTK嵌入到Qt里,并封装成一个dll,通过接口提供给C#访问。

实现:

一,Qt程序的配置

这里用到了一第三方库(qt-solutions/qtwinmigrate at master · qtproject/qt-solutions · GitHub),它可以将Qt的窗口给C#使用。

1,首先看pro文件,主要是dll编译配置,和第三方库引用及VTK的依赖库。

2,main.cpp

#include "widget.h"
#include <QApplication>

#include <windows.h>
#include <qmfcapp.h>
#include <qwinwidget.h>

// int main(int argc, char *argv[])
// {
//     QApplication a(argc, argv);
//     Widget w;
//     w.show();
//     return a.exec();
// }

BOOL WINAPI DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpvReserved*/ )
{
    static bool ownApplication = FALSE;

    if ( dwReason == DLL_PROCESS_ATTACH )
        ownApplication = QMfcApp::pluginInstance( hInstance );
    if ( dwReason == DLL_PROCESS_DETACH && ownApplication )
        delete qApp;

    return TRUE;
}

QWinWidget *win=nullptr;
extern "C" __declspec(dllexport) bool initWindow( HWND parent )
{
    if(parent==nullptr)
        return false;
    win = new QWinWidget(parent);
    Widget *widget = new Widget(win);
    widget->show();
    win->move(0,0);
    win->show();

    return TRUE;
}

extern "C" __declspec(dllexport) bool destroyWindow()
{
    if(win!=0){
        win->close();
        delete win;
    }

    return TRUE;
}

3,Widget 写法,可以参考这篇文章(集成VTK | Qt hello)或者看仓库上的源码。

二,C#端

1,引用dll 并调用接口

using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp
{
    public partial class Form1 : Form
    {
        [DllImport("VTKNet.dll", EntryPoint = "initWindow", CharSet = CharSet.Ansi)]
        public extern static bool initWindow(IntPtr parent);

        [DllImport("VTKNet.dll", EntryPoint = "destroyWindow", CharSet = CharSet.Ansi)]
        public extern static bool destroyWindow();

        public Form1()
        {
            InitializeComponent();
            //打开窗口
            initWindow(this.Handle);
        }
    }
}

2,exe路径下 需要把自己的dll ,Qt的dll 以及VTK的dll 全部放进去。

效果:

C#通过Qt使用VTK | Qt hello

代码:

C#通过Qt使用VTK | Qt hello

  • 20
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要在Qt使用VTK(Visualization Toolkit)加载obj3d模型,您可以使用VTKQt插件,即VTKQt渲染窗口类QVTKOpenGLNativeWidget。 以下是一个简单的示例代码: ```cpp #include <vtkSmartPointer.h> #include <vtkOBJReader.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <QVTKOpenGLNativeWidget.h> #include <QVBoxLayout> #include <QApplication> #include <QWidget> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建Qt窗口和布局 QWidget *widget = new QWidget(); QVBoxLayout *layout = new QVBoxLayout(widget); // 创建QVTKOpenGLNativeWidget并添加到布局中 QVTKOpenGLNativeWidget *vtkWidget = new QVTKOpenGLNativeWidget(); layout->addWidget(vtkWidget); // 创建VTK渲染器和渲染窗口 vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->AddRenderer(renderer); // 将QVTKOpenGLNativeWidget与VTK渲染窗口关联 vtkWidget->SetRenderWindow(renderWindow); // 加载obj3d模型 vtkSmartPointer<vtkOBJReader> reader = vtkSmartPointer<vtkOBJReader>::New(); reader->SetFileName("path/to/your/model.obj"); reader->Update(); // 创建VTK演员和映射器 vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); mapper->SetInputConnection(reader->GetOutputPort()); vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(mapper); // 将演员添加到渲染器中 renderer->AddActor(actor); // 显示窗口 widget->show(); // 运行Qt事件循环 return app.exec(); } ``` 在上面的代码中,我们创建了一个Qt窗口和布局,然后创建了一个QVTKOpenGLNativeWidget并将其添加到布局中。然后,我们创建了一个VTK渲染器和渲染窗口,并将QVTKOpenGLNativeWidget与VTK渲染窗口关联。接下来,我们加载obj3d模型并创建VTK演员和映射器。最后,我们将演员添加到渲染器中,并显示窗口。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

土拨鼠不是老鼠

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

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

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

打赏作者

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

抵扣说明:

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

余额充值