如何将Qt信号映射到托管C++中的事件(C++/CLI)

not*_*tbo 6 qt c++-cli event-handling signals-slots

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

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

Ale*_*x F 5

定义普通的非托管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;
}

ManagedClass.h:

#pragma once

class UnmanagedClass;

// Wrapper
ref class ManagedClass
{
public:
    ManagedClass(void);
    ~ManagedClass();
    !ManagedClass();
    void 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()
{
    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.");
}

UnmanagedClass.h:

#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;
};

UnmanagedClass.cpp:

#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();
}

这让您了解非托管类和托管包装器如何一起使用.如果您了解Qt编程并且知道如何从ref C++/CLI类引发.NET事件,那么这足以完成您的任务.