WPF调用带界面Qt Dll

Qt和WPF比较---控件布局和消息响应 所谓大道归一,其实很多的方法,虽然初期不同,但发展到一定程度后,往往又会出现惊人的相似之处。   WPF和Qt是分别隶属微软和Nokia,前者是一个商业开发平台,后者则完全开源。但他们都提供给界面开发者使用。在使用了一段时间之后,发现二者其实有很多相同的思路。   就界面的组织而言,WPF使用xaml来定义控件,完全学习了html的方式。控件之间可以任意组合,任意包含。这相对于MFC方 阅读详情

参考博客:
https://blog.youkuaiyun.com/shuishanga/article/details/52183159
https://blog.youkuaiyun.com/zuoyefeng1990/article/details/70885220

 

0. 开发环境

Qt 5.9.0  Desktop Qt MSVC2015 64bit

VS2015 64bit

1. 思路

qt重写消息循环,自定义C接口,生成dll

dll可以用mfc和wpf调用

这里使用WPF实现qt dll调用

 

2. 项目说明

文档中两个项目

qtdll:qt库源码,项目在路径 qt-solutions-master\qtwinmigrate\examples\qtdll

WpfCallQtDialogDll:wpf程序

 

3. 核心代码

qtdll

实现了两个接口函数,add()和showDialog(HWND parent)

mainwindow是串口调试功能的界面,调用时会显示

showDialog使用时传入句柄

main.cpp

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

#include "mainwindow.h"

//  copy .\qtdialog.dll "D:\projects\2019\RobotControl20190304\WpfApplicationCallRobotDll\WpfA
//  pplicationCallRobotDll\bin\x64\Debug"


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;
MainWindow *mainWindow;
extern "C" __declspec(dllexport) bool showDialog( HWND parent )
{
    win = new QWinWidget(parent);
    win->showCentered();

    mainWindow = new MainWindow(win);
    mainWindow->setWindowFlags(mainWindow->windowFlags()& ~Qt::WindowMaximizeButtonHint | Qt::Dialog);
    mainWindow->show();

    // QMessageBox::about( win, "About QtMfc", "QtMfc Version 2.0\nCopyright (C) 2003" );

    return TRUE;
}

extern "C" __declspec(dllexport) bool destroyDialog()
{
    if(win != 0)
    {
        delete win;
        //delete serial;
    }

    return TRUE;
}

extern "C" __declspec(dllexport) int add(int a, int b)
{
    return a + b;
}

 

wpf

mainwindow.xaml.cs

using System;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Interop;

namespace WpfCallQtDialogDll
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        [DllImport("qtdialog.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool showDialog(IntPtr parent);

        [DllImport("qtdialog.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern int add(int a, int b);

        public MainWindow()
        {
            InitializeComponent();
        }

        private void btnShowDialog_Click(object sender, RoutedEventArgs e)
        {
            IntPtr hwnd = new WindowInteropHelper(this).Handle;

            showDialog(hwnd);
        }

        private void btnAdd_Click(object sender, RoutedEventArgs e)
        {
            int restult = add(1, 2);
        }
    }
}

4. 使用方法

qtdll编译生成的qtdialog.dll 

qt5dll(UI)\qtdll(UI)\qt-solutions-master\qtwinmigrate\examples\build-qtdll-Desktop_Qt_5_9_0_MSVC2015_64bit-Debug\debug\qtdialog.dll

拷贝到wpf

WpfCallQtDialogDll\WpfCallQtDialogDll\bin\x64\Debug\qtdialog.dll"

 

4. 运行效果

C# WPF上位机开发(QT vs WPF) 【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 最近经常收到朋友们的私信,他们对C# WPF开发很感兴趣,但是呢,正当准备学习的时候,又有人告诉他们应该学习c++ Qt。这么一来,他们往往就拿不清楚主意了,不知道是应该继续学习WPF呢,还是重新学习QT呢,因为看上来两种语言都不错,都有很好的发展前景。既然遇到这个问题的同学不在少数,趁着今天有时间,我们可以具体地讨论一下,一项一项拆开来看。 阅读详情

相关推荐

C#调用QT DLL嵌入界面:P/Invoke桥接与HWND集成完整指南

在桌面应用开发中,跨语言UI集成是常见挑战,尤其是当C++团队基于QT构建界面,而C#团队使用WinForms或WPF维护业务逻辑时,如何让C#调用QT生成的界面DLL成为关键难题。其核心在于理解QT DLL并非普通原生库,它自带事件循环和窗口生命周期,直接使用P/Invoke调用容易导致白屏、闪退或线程卡死。通过导出C风格接口、利用HWND窗口句柄嵌入,并协调QT事件循环与C#消息泵,可以构建稳定可靠的跨语言UI桥接方案。该技术广泛应用于混合桌面应用、插件系统、旧系统迁移等场景。本文以完整工程为实例,详细

weixin_30225755的博客 159

C#将外部窗口嵌入到WPF控件当中

C#讲外部窗口嵌入到WPF控件当中本Markdown编辑器使用[StackEdit][6]修改而来,用它写博客,将会带来全新的体验哦: 可能会用到的API函数 public class Win32API { #region Win32 API [DllImport("user32.dll", EntryPoint = "GetWindowThreadP

Fourier的博客 1万+

C#调用Qt界面DLL:P/Invoke窗口嵌入与避坑指南

跨语言编程中,托管代码与非托管代码的互操作是常见技术挑战。P/Invoke 作为 Windows 平台的标准机制,允许 C# 调用 C++ 导出的函数,但涉及 Qt 界面时,还需处理 QApplication 初始化、窗口句柄传递等关键问题。本文从互操作原理出发,分析 C# 调用 Qt DLL 的完整流程,涵盖 DllImport 声明、窗口嵌入技巧及消息循环处理,并结合实战避坑经验,帮助开发者实现稳定的跨语言界面集成。该方案适用于拥有 C++ 算法库或设备 SDK、需在 C# 业务系统中复用 Qt 界面的

weixin_32821533的博客 220

C# WPF调用 QT窗口

C#(WPF)调用C++界面(QT)作为控件。

weixin_45785927的博客 4940

C#调用C++ QT DLL:基于HWND的跨语言界面嵌入方案

跨语言UI集成是桌面开发中的常见挑战,C#与C++ QT之间的界面互操作尤为典型。P/Invoke技术提供了一条轻量级路径:通过导出原生窗口句柄HWND,并借助Win32的SetParent函数,将QT渲染的窗口嵌入C#容器。相比COM注册和C++/CLI的运行时约束,这种方案无需修改对象模型,仅以C函数和句柄为边界,即可实现WinForms对QT界面的承载。其核心原理在于QT窗口本质是标准Win32窗口,句柄可自由迁移,配合线程模型与生命周期管理,可稳定完成跨语言UI融合。该方案适用于已有编译好的QT D

weixin_31421613的博客 237

C#嵌入QT界面DLL:跨语言UI复用实战

在桌面应用开发中,跨语言UI复用常面临C#与C++ QT界面集成的挑战。其原理是通过C接口桥接层,将QT编译的界面DLL封装为纯C导出函数,利用P/Invoke实现C#调用,并借助事件循环驱动解决消息泵冲突。这种技术能显著降低重写成本,复用经过验证的QT界面资产,适用于工业上位机、桌面工具等场景。本文以C#主程序嵌入QT界面DLL为例,详解三层架构设计、编译部署及避坑经验,帮助开发者高效实现跨语言界面复用。

weixin_31421613的博客 232

qt调用wpf控件

本文介绍如何在Qt应用中调用WPF窗口,通过C++/CLI作为中间层解决跨平台技术整合难题。实现流程包括:Qt触发按钮事件→C++导出类转发→C++/CLI处理STA线程→调用WPF控件库显示窗口。重点解决了非托管C++与托管.NET的通信问题,以及WPF必需的STA线程模型要求。该方案适用于在Qt项目中复用WPF组件的场景,有效提高开发效率,但需注意平台一致性、线程模型和编译配置等技术细节。

qq_52335274的博客 862

C#上位机调用QT DLL跨语言封装实战

跨语言调用是现代软件开发中常见的需求,尤其在工业上位机领域,不同语言各有所长,如何高效集成成为关键。DLL封装是一种成熟的技术手段,通过C风格接口将C++/QT代码编译为动态链接库,再由C#通过P/Invoke调用,可有效打破语言壁垒。这一过程涉及调用约定匹配、字符串编码转换、内存分配与释放规则等核心原理,同时需要警惕GC回收对回调函数的影响。掌握这些要点,开发者可以在保留C#快速开发优势的同时,借助QT在复杂界面渲染与高频数据处理上的性能,用于实时曲线绘制、信号处理等场景,极大提升系统的流畅度与可维护性。

weixin_33483304的博客 189

qt5编写dll给c#调用

最近手头有个项目, qt编写dll, 实现串口通信, 并用c# wpf调用 参考文献:https://www.cnblogs.com/feiyangqingyun/p/3720777.html 这里使用的是qtwinmigrate的类库 移植上面作者实现dll时, 报了很多错,猜测可能是作者是qt4写的 qt dll 1. 目录树: src是qtwinmigrate中的文件 m...

Empty_Android的博客 1969

C# 调用 Qt 界面 DLL:跨语言窗口嵌入与消息循环实践

跨语言互操作的核心,是让托管代码与非托管原生界面在进程内通过稳定 ABI 和窗口句柄协作。P/Invoke 负责把 C# 调用映射到 C 导出函数,Qt 界面则在独立线程创建 QApplication 与顶层窗口,再借 SetParent 嵌入宿主 Panel;两条消息循环各自泵消息,跨线程操作统一排队,回调委托需长期持有以避免野指针。这样做的技术价值在于复用存量 Qt 界面、降低重写成本,同时把原生 GUI 的线程亲和性与托管业务逻辑解耦。该模式适用于工控上位机、C# 工具链集成复杂图形界面以及旧系统渐进

weixin_30074763的博客 315

QT封装DLL给C#调用:跨语言窗口嵌入与崩溃排查指南

在工业上位机开发中,QT与C#常被用于同一系统的不同层次:QT擅长复杂界面与组态显示,C#负责业务逻辑与通信控制。要让两者协作,常见方案是将QT界面封装为DLL,通过导出C接口供C#以P/Invoke方式调用。该方案的核心原理是跨语言边界只认C函数签名,需在QT侧维护对象生命周期,并借助SetParent将QT窗口嵌入WinForms或WPF容器。理解调用约定、字符串编码、结构体对齐及句柄语义,能有效规避DllNotFoundException、白屏、进程退出崩溃等典型问题。在实际工程中,先建立ping函数

weixin_32612263的博客 200

C#的WinForm中嵌入Qt界面库

C#的WinForm中嵌入Qt界面库 为何会有如此奇葩需求 一处代码,多处运行 C#有两种写界面的框架,winFrom和WPF,这二者写的界面可以相互调用,但C#编写的界面组件在非托管C++虽然理论上可以,但是这种类似反射的机制使用其他来说特别不舒服。而对于编写组件式SDK而言,核心的界面组件可以在C++、C#、JAVA中使用而无需修改太多的代码是我们的终级目标。 ocx 编写难度太大 使用MFC编写的OCX控件可以嵌套在各种高级语言甚至浏览器中,但对于新时代的开发人员而言,会MFC开发的越

揽月凡尘 1万+

C#调用Qt DLL完全指南:P/Invoke跨语言编程实战与踩坑记录

跨语言编程是现代桌面开发中常见需求,C#与C++/Qt混合架构在工业上位机、视觉检测等场景中应用广泛。通过P/Invoke技术,C#可以调用Qt封装的标准DLL,实现成熟UI模块的复用,同时保持业务逻辑层的开发效率。但在实际工程中,调用约定不一致、字符集不匹配、线程模型冲突、内存生命周期错位等问题,往往导致程序崩溃或行为异常。此外,Qt依赖DLL缺失、x86/x64平台不匹配以及第三方库同名冲突,也会引发运行时错误。掌握C接口导出、委托回调和句柄管理的关键细节,能够有效规避dll冲突与随机崩溃。本文基于真实

weixin_29305313的博客 85

c# 无法加载oraops.dll_C#的WinForm中嵌入Qt界面库

C#的WinForm中嵌入Qt界面库为何会有如此奇葩需求 一处代码,多处运行 C#有两种写界面的框架,winFrom和WPF,这二者写的界面可以相互调用,但C#编写的界面组件在非托管C++虽然理论上可以,但是这种类似反射的机制使用其他来说特别不舒服。而对于编写组件式SDK而言,核心的界面组件可以在C++、C#、JAVA中使用而无需修改太多的代码是我们的终级目标。 ocx 编写难度太大 使用MF...

weixin_39688019的博客 199

MFC调用QT页面

MFC 调用QT制作的界面,非常好用,值得学习。

手把手教学:利用AutoDL与vLLM快速部署DeepSeek-R1大模型实战指南

本文详细介绍了如何利用AutoDL平台和vLLM框架快速部署DeepSeek-R1大模型的实战指南。从服务器配置、vLLM安装优化到模型部署的两种方案,再到性能调优和生产环境建议,手把手教你高效完成大模型部署。特别针对国内开发者遇到的网络问题提供了稳定解决方案,并分享了显存优化、磁盘清理等实用技巧。

weixin_42531779的博客 327

Qt开发Activex笔记(三):C#调用Qt开发的Activex控件

开发Activex控件,以供其他应用程序调用,本篇章讲解C#调用Activex控件,不限于Qt开发的Activex控件。Wpf要调用Activex控件,必要先用C#对Activex控件进行包装,然后提供给Wpf调用。

长沙红胖子 Qt・西安|省级科研团队从业背景,深耕双一流体系高精尖技术配套研发|剥离高精尖机理,沉淀高端特种行业领域 Qt 工程化落地经验|博文仅分享通用技术总结,输出公开普适工程思路。 4万+

三菱PLC通信库大比拼:手把手教你用C#实现最高效的McProtocol数据读写

本文深入比较了三菱PLC通信库的性能,重点介绍了如何使用C#高效实现McProtocol数据读写。通过实测数据对比HslCommunication、McProtocol-next和自定义方案的优劣,提供优化技巧和代码示例,帮助开发者在工业自动化场景中提升通信效率。

m0n1o2p的博客 255

如何使用java调用DLL控件

使用java调用DLL控件

sean的博客 701

人像抠图 + OpenGL ES 还能这样玩?没想到吧(附带源码)

OpenGL ES 利用抠图算法实现人像留色。

字节流动 3万+

【即插即用模块】Transformer篇 | ICCV 2025 | MALA :注意力分布神似Softmax,告别线性注意力性能短板!

MALA(Magnitude-Aware Linear Attention)是一种改进的线性注意力机制,通过引入缩放因子和偏移项,解决了传统线性注意力忽视查询幅度的问题,使其分布更接近Softmax Attention。该模块具有线性复杂度(O(n)),结合RoPE和LEPE编码实现全局-局部位置信息混合,通过z值调制平衡信息权重。实验表明MALA在轻量级视觉任务中能有效平衡效率与精度,注意力可视化显示其分布与Softmax Attention高度相似。代码提供完整的RoPE位置编码和线性注意力

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1106
上一篇: qt5编写dll给c#调用
下一篇: Qt Log4qt实现的日志记录
Empty_Android
博客等级 码龄10年 98粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值