2010-10-12 2 views
6

Sto scrivendo un wrapper in .NET (C++/CLI) per poter utilizzare un codice Qt C++ nativo in .NET. Come posso mappare un segnale Qt in un evento .NET gestito, in modo che quando il mio codice Qt attiva un segnale, posso inoltrarlo al codice .NET.Come mappare il segnale Qt all'evento in C++ gestito (C++/CLI)

La mia classe Managed definisce l'evento, ma se provo a utilizzare il normale metodo QObject :: connect per collegarmi al segnale, è necessario un ricevitore QObject * ... Suppongo di dover eseguire un magic marshalling di alcuni tipi?

risposta

5

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.

+0

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

+0

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

+1

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