Определить обычный неуправляемый обработчик событий Qt. Из этого обработчика выведите управляемое событие.
Редактировать: если у вас есть предыдущий опыт работы с Qt, вы знаете, как обрабатывать сигналы Qt в неуправляемом классе. Не пытайтесь сделать этот класс управляемым. Вместо этого напишите оболочку C ++ / CLI, которая содержит этот производный от QObject класс.
Редактировать 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 и знаете, как вызывать событие .NET из класса ref C ++ / CLI, этого достаточно для выполнения вашей задачи.