如何将Qt信号映射到托管C++;(C+;+;/CLI) 我在.NET(C++ + CLI)中编写了一个包装器,以便能够在.NET中使用一些本地C++ QT代码。如何将Qt信号映射到托管的.NET事件中,以便当我的Qt代码触发信号时,我可以将其转发给.NET代码

如何将Qt信号映射到托管C++;(C+;+;/CLI) 我在.NET(C++ + CLI)中编写了一个包装器,以便能够在.NET中使用一些本地C++ QT代码。如何将Qt信号映射到托管的.NET事件中,以便当我的Qt代码触发信号时,我可以将其转发给.NET代码,qt,event-handling,c++-cli,signals-slots,Qt,Event Handling,C++ Cli,Signals Slots,我的托管类定义了事件,但是如果我尝试使用普通的QObject::connect方法连接到信号,它需要一个QObject*接收器。。。我想我必须做一些神奇的编组工作?定义普通的非托管Qt事件处理程序。在此处理程序中,引发托管事件 编辑:若您以前有Qt方面的经验,那个么您知道如何在非托管类中处理Qt信号。不要试图管理这个类。而不是编写包含此QObject派生类的C++/CLI包装器 编辑2。创建C++/CLI控制台应用程序,将其称为test1,并向其添加以下代码: test1.cpp: #inclu

我的托管类定义了事件,但是如果我尝试使用普通的QObject::connect方法连接到信号,它需要一个QObject*接收器。。。我想我必须做一些神奇的编组工作?

定义普通的非托管Qt事件处理程序。在此处理程序中,引发托管事件

编辑:若您以前有Qt方面的经验,那个么您知道如何在非托管类中处理Qt信号。不要试图管理这个类。而不是编写包含此QObject派生类的C++/CLI包装器

编辑2。创建C++/CLI控制台应用程序,将其称为test1,并向其添加以下代码:

test1.cpp:

#include "stdafx.h" #include "ManagedClass.h" using namespace System; int main(array ^args) { ManagedClass^ c = gcnew ManagedClass(); c->Test(); return 0; } #包括“stdafx.h” #包括“ManagedClass.h” 使用名称空间系统; int main(数组^args) { ManagedClass ^c=gcnew ManagedClass(); c->Test(); 返回0; } ManagedClass.h:

#pragma once class UnmanagedClass; // Wrapper ref class ManagedClass { public: ManagedClass(void); ~ManagedClass(); !ManagedClass(); void Test(); void Callback(); private: UnmanagedClass* m_pUnmanagedClass; }; #pragma once #include using namespace System; ref class ManagedClass; // Wrapped native class class UnmanagedClass { public: UnmanagedClass(ManagedClass^ pWrapper); ~UnmanagedClass(void); void Test(); private: gcroot m_pWrapper; }; #布拉格语一次 类非托管类; //包装纸 ref类ManagedClass { 公众: ManagedClass(无效); ~ManagedClass(); !ManagedClass(); 无效试验(); 无效回调(); 私人: 非托管类*m_pUnmanagedClass; }; ManagedClass.cpp:

#include "StdAfx.h" #include "ManagedClass.h" #include "UnmanagedClass.h" ManagedClass::ManagedClass(void) { m_pUnmanagedClass = new UnmanagedClass(this); } ManagedClass::~ManagedClass() { this->!ManagedClass(); GC::SuppressFinalize(this); } ManagedClass::!ManagedClass() { if ( m_pUnmanagedClass ) { delete m_pUnmanagedClass; m_pUnmanagedClass = NULL; } } void ManagedClass::Test() { m_pUnmanagedClass->Test(); } void ManagedClass::Callback() { Console::WriteLine(L"This text is printed from managed wrapper function, called from unmanaged class."); Console::WriteLine(L"Here you can raise managed event for .NET client."); Console::WriteLine(L"Let's say that UnmanagedClass is QObject-derived, and this funcstion"); Console::WriteLine(L"is called from UnmanagedClass Qt event handler - this is what you need."); } #include "StdAfx.h" #include "UnmanagedClass.h" #include "ManagedClass.h" UnmanagedClass::UnmanagedClass(ManagedClass^ pWrapper) { m_pWrapper = pWrapper; } UnmanagedClass::~UnmanagedClass(void) { } void UnmanagedClass::Test() { m_pWrapper->Callback(); } #包括“StdAfx.h” #包括“ManagedClass.h” #包括“UnmanagedClass.h” ManagedClass::ManagedClass(无效) { m_pUnmanagedClass=新的非托管类(this); } ManagedClass::~ManagedClass() { 此->!ManagedClass(); GC::SuppressFinalize(此); } ManagedClass::!ManagedClass() { if(m_pUnmanagedClass) { 删除m_PundManagedClass; m_pUnmanagedClass=NULL; } } void ManagedClass::Test() { m_pUnmanagedClass->Test(); } void ManagedClass::Callback() { 控制台::WriteLine(L“此文本从托管包装函数打印,从非托管类调用”); 控制台::WriteLine(L“在这里您可以为.NET客户端引发托管事件”); 控制台::WriteLine(L“假设非托管类是QObject派生的,这个函数”); 控制台::WriteLine(L“是从非托管类Qt事件处理程序调用的-这是您所需要的。”); } UnmanagedClass.h:

#pragma once class UnmanagedClass; // Wrapper ref class ManagedClass { public: ManagedClass(void); ~ManagedClass(); !ManagedClass(); void Test(); void Callback(); private: UnmanagedClass* m_pUnmanagedClass; }; #pragma once #include using namespace System; ref class ManagedClass; // Wrapped native class class UnmanagedClass { public: UnmanagedClass(ManagedClass^ pWrapper); ~UnmanagedClass(void); void Test(); private: gcroot m_pWrapper; }; #布拉格语一次 #包括 使用名称空间系统; ref类ManagedClass; //包装本机类 类非托管类 { 公众: 非托管类(托管类^pwraper); ~非托管类(void); 无效试验(); 私人: gcroot m_pWrapper; }; UnmanagedClass.cpp:

#include "StdAfx.h" #include "ManagedClass.h" #include "UnmanagedClass.h" ManagedClass::ManagedClass(void) { m_pUnmanagedClass = new UnmanagedClass(this); } ManagedClass::~ManagedClass() { this->!ManagedClass(); GC::SuppressFinalize(this); } ManagedClass::!ManagedClass() { if ( m_pUnmanagedClass ) { delete m_pUnmanagedClass; m_pUnmanagedClass = NULL; } } void ManagedClass::Test() { m_pUnmanagedClass->Test(); } void ManagedClass::Callback() { Console::WriteLine(L"This text is printed from managed wrapper function, called from unmanaged class."); Console::WriteLine(L"Here you can raise managed event for .NET client."); Console::WriteLine(L"Let's say that UnmanagedClass is QObject-derived, and this funcstion"); Console::WriteLine(L"is called from UnmanagedClass Qt event handler - this is what you need."); } #include "StdAfx.h" #include "UnmanagedClass.h" #include "ManagedClass.h" UnmanagedClass::UnmanagedClass(ManagedClass^ pWrapper) { m_pWrapper = pWrapper; } UnmanagedClass::~UnmanagedClass(void) { } void UnmanagedClass::Test() { m_pWrapper->Callback(); } #包括“StdAfx.h” #包括“UnmanagedClass.h” #包括“ManagedClass.h” UnmanagedClass::UnmanagedClass(ManagedClass ^pWrapper) { m_pRapper=pRapper; } UnmanagedClass::~UnmanagedClass(void) { } void UnmanagedClass::Test() { m_pRapper->Callback(); }
这使您了解非托管类和托管包装器可以如何一起使用。如果您了解Qt编程并知道如何从ref C++/CLI类引发.NET事件,这就足以完成您的任务。

我是否为此创建一个新的QObject继承类?如果没有,如何将托管类连接到Qt信号?QObject::connect仅接受QObject*。。。你有一个小的代码示例吗?很抱歉,我在这里很愚蠢。。我是否应该创建另一个Qt类来连接信号,并从其插槽中以某种方式引发托管事件?这个Qt类应该是我的C++/CLI项目的一部分吗?因为我想这一个需要修改?它如何知道托管事件并提出它?看来你以前也这么做过。。您是否有一些代码可以分享,说明如何做到这一点?谢谢!我现在已经解决了这个问题。。对于以后可能阅读此内容的其他人。。让非托管类从QObject继承,以便它可以连接到Qt信号。请记住,您还需要MOC非托管类(在您的C++/CLI项目中涉及的文件上的自定义构建步骤)。