Definire un gestore di eventi Qt normale non gestito. Da questo gestore, aumenta l'evento gestito.
Modifica: se hai esperienza precedente in Qt, sai come gestire i segnali Qt nella classe non gestita. Non cercare di rendere questa classe gestita. Invece di questo, scrivere wrapper C++/CLI che contenga questa classe derivata da QObject.
Modifica 2. Creare applicazioni C++/CLI Console, lo chiamano test1, e aggiungere il seguente codice a esso:
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();
}
Questo vi dà un'idea di come classe non gestito e wrapper gestita possono giocare insieme. Se conosci la programmazione Qt e sai come generare eventi .NET dalla classe ref C++/CLI, questo è sufficiente per svolgere il tuo compito.
fonte
2010-10-12 13:44:06
Devo creare una nuova classe ereditata QObject per questo scopo? In caso contrario, come collego la mia classe gestita al segnale Qt? QObject :: connect only accetta QObject * ... Hai un piccolo esempio di codice? – notbo
Ci scusiamo per essere stupidi qui .. dovrei creare un'altra classe Qt per connettermi al segnale, e dal suo slot alzare l'evento gestito in qualche modo? Questa classe Qt dovrebbe far parte del mio progetto C++/CLI? Perché questo deve essere mocato, immagino? E come farebbe a sapere dell'evento gestito e alzarlo? Sembra che tu l'abbia già fatto prima. Hai del codice da condividere che mostra come farlo? – notbo
Grazie! Ora ho risolto il problema .. Per altre persone che potrebbero leggerlo più tardi .. Avere la classe non gestita ereditare da QObject, in modo che possa connettersi al segnale Qt. Ricordare che è necessario MOC anche la classe non gestita (passaggio personalizzato di creazione del file coinvolto nel progetto C++/CLI). – notbo