我正在.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事件,则足以完成您的任务。

10-04 12:57