我正在.NET(C++/CLI)中编写包装程序,以便能够在.NET中使用某些 native C++ Qt代码。如何将Qt信号映射到托管的.NET事件中,以便在我的Qt代码触发信号时,可以将其转发到.NET代码。
我的Managed类定义了事件,但是如果我尝试使用普通的QObject::connect方法来连接信号,则需要QObject *接收器...我想我必须进行某种魔术编码吗?
最佳答案
定义普通的非托管Qt事件处理程序。从此处理程序中,引发托管事件。
编辑:如果您以前有Qt的经验,您知道如何处理非托管类中的Qt信号。不要试图使此类成为托管类。取而代之的是,编写包含QObject派生类的C++/CLI包装器。
编辑2.创建C++/CLI控制台应用程序,将其称为test1,并向其中添加以下代码:
test1.cpp:
#include“stdafx.h”
#include“ManagedClass.h”
使用 namespace 系统;
int main(数组^ args)
{
ManagedClass ^ c = gcnew ManagedClass();
c-> Test();
返回0;
}
ManagedClass.h:
#pragma一次
class UnmanagedClass;
//包装器
引用类ManagedClass
{
上市:
ManagedClass(void);
〜ManagedClass();
!ManagedClass();
无效Test();
void Callback();
私有(private)的:
UnmanagedClass * 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()
{
如果(m_pUnmanagedClass)
{
删除m_pUnmanagedClass;
m_pUnmanagedClass = NULL;
}
}
无效ManagedClass::Test()
{
m_pUnmanagedClass-> Test();
}
无效ManagedClass::Callback()
{
Console::WriteLine(L“此文本是从托管包装函数打印的,从非托管类调用。”);
Console::WriteLine(L“您可以在此处引发.NET客户端的托管事件。”);
Console::WriteLine(L“假设UnmanagedClass是QObject派生的,并且此功能”);
Console::WriteLine(L“从UnmanagedClass Qt事件处理程序中调用-这就是您所需要的。”);
}
UnmanagedClass.h:
#pragma一次
#包括
使用 namespace 系统;
ref class ManagedClass;
//包装的 native 类
类UnmanagedClass
{
上市:
UnmanagedClass(ManagedClass ^ pWrapper);
〜UnmanagedClass(无效);
无效Test();
私有(private)的:
gcroot m_pWrapper;
};
UnmanagedClass.cpp:
#include“StdAfx.h”
#include“UnmanagedClass.h”
#include“ManagedClass.h”
UnmanagedClass::UnmanagedClass(ManagedClass ^ pWrapper)
{
m_pWrapper = pWrapper;
}
UnmanagedClass::〜UnmanagedClass(无效)
{
}
无效UnmanagedClass::Test()
{
m_pWrapper-> Callback();
}
这使您了解非托管类和托管包装器如何一起使用。如果您知道Qt编程并且知道如何从ref C++/CLI类引发.NET事件,则足以完成您的任务。