C#通过Qt使用VTK

server/2024/9/23 14:27:29/

需求:

一个项目,界面是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


http://www.ppmy.cn/server/12149.html

相关文章

对享元模式的理解

目录 一、场景1、简单的案例 二、通过享元模式实现1、代码2、个人思考 一、场景 有时候&#xff0c;一个程序要创建大量相似的对象&#xff0c;例如&#xff0c;游戏中需要渲染很多的子弹&#xff0c;但这些子弹除了位置不同外&#xff0c;其余都相同。如果我们不将相同的部分…

ElasticSearch 入门学习

一、ElasticSearch定义 ElasticsSearch 是一个分布式的实时文档存储&#xff0c;每个字段 可以被索引与搜索也是一个分布式实时分析搜索引擎也是一个能胜任上百个服务节点的扩展&#xff0c;并支持 PB 级别的结构化或者非结构化数据。 二、ElasticSearch安装和启动 1.安装JA…

薄板样条插值TPS原理以及torch和opencv实现

薄板样条插值TPS原理以及torch和opencv实现 1、薄板样条插值TPS原理概述原理以及公式推导2、torch实现3、opencv实现1、薄板样条插值TPS原理 概述 薄板样条(Thin Plate Spline),简称TPS,是一种插值方法,可找到通过所有给定点的“最小弯曲”光滑曲面。因为它一般都是基于…

Hive数据类型

1.基本数据类型 示例&#xff1a; -- 创建表并定义列的数据类型 CREATE TABLE data_types_example (tinyint_column TINYINT,smallint_column SMALLINT,int_column INT,bigint_column BIGINT,boolean_column BOOLEAN,float_column FLOAT,double_column DOUBLE,string_column S…

最详细步骤解决:Apps targeting Android12 and higher are required to specify...

问题原因&#xff1a; 当targetSdkVersion>31时&#xff0c;需要在AndroidManifest.xml中配置android:exported的值&#xff0c;该值为boolean类型。 android:exported解释&#xff1a; activity 是否可由其他应用的组件启动&#xff1a; 如果设为 "true"&#…

人脸服务的算法内容

人脸算法可以返回在图像中找到的任何人脸的矩形坐标&#xff0c;以及与这些人脸相关的一系列属性&#xff0c;例如&#xff1a; 配饰&#xff1a;指示给定的人脸是否有配饰。 此属性会返回可能的配饰&#xff0c;包括头饰、眼镜和口罩&#xff0c;每个配饰的置信度分数介于 0 …

openGauss学习笔记-269 openGauss性能调优-TPCC性能调优测试指导-数据库服务端及客户端绑核

文章目录 openGauss学习笔记-269 openGauss性能调优-TPCC性能调优测试指导-数据库服务端及客户端绑核269.1 安装openGauss数据库269.2 停止数据库269.3 使用gs_guc工具修改数据库端口、IP等269.4 使用gs_guc工具设置如下参数269.5 执行如下命令以绑核方式启动服务端数据库269.6…

使用Pycharm运行spark实例时没有pyspark包(ModuleNotFoundError: No module named ‘py4j‘)

一、问题描述 在安装并配置pyspark&#xff0c;下载并打开Pycharm&#xff08;专业版&#xff09;后进行spark实例操作&#xff08;笔者以统计文件中的行数为例&#xff09;时&#xff0c;运行程序后提示ModuleNotFoundError: No module named py4j&#xff1a; 二、解决办法 …