Как отобразить сигнал Qt на событие в управляемом C ++ (C ++ / CLI) - PullRequest
6 голосов
/ 12 октября 2010

Я пишу оболочку в .NET (C ++ / CLI), чтобы иметь возможность использовать некоторый нативный код C ++ Qt в .NET.Как я могу отобразить сигнал Qt в управляемое событие .NET, чтобы, когда мой код Qt запускал сигнал, я мог перенести это в код .NET.

Мой управляемый класс определяет событие, ноесли я пытаюсь использовать обычный метод QObject :: connect для подключения к сигналу, для этого требуется приемник QObject * ... Полагаю, мне нужно выполнить какое-то магическое сортирование?

1 Ответ

5 голосов
/ 12 октября 2010

Определить обычный неуправляемый обработчик событий 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, этого достаточно для выполнения вашей задачи.

...