2010-10-12 8 views
6

Tôi đang viết một trình bao bọc trong .NET (C++/CLI) để có thể sử dụng một số mã C++ Qt gốc trong .NET. Làm thế nào tôi có thể ánh xạ một tín hiệu Qt vào một sự kiện .NET được quản lý, để khi mã Qt của tôi kích hoạt một tín hiệu, tôi có thể chuyển tiếp mã này sang mã .NET.Cách ánh xạ Tín hiệu Qt đến Sự kiện trong Managed C++ (C++/CLI)

Lớp được quản lý của tôi xác định sự kiện, nhưng nếu tôi cố gắng sử dụng phương pháp kết nối QObject :: bình thường để kết nối với tín hiệu, nó yêu cầu bộ thu QObject * ... tôi đoán tôi phải thực hiện một số phép thuật một số loại?

Trả lời

5

Xác định trình xử lý sự kiện Qt không được quản lý bình thường. Từ trình xử lý này, hãy tăng sự kiện được quản lý.

Chỉnh sửa: nếu bạn có kinh nghiệm trước đó trong Qt, bạn biết cách xử lý tín hiệu Qt trong lớp không được quản lý. Đừng cố gắng làm cho lớp này được quản lý. Thay vào đó, hãy viết trình bao bọc C++/CLI có chứa lớp dẫn xuất QObject này.

Sửa 2. Tạo ứng dụng C++/CLI Console, gọi nó là test1, và thêm đoạn mã sau vào nó:

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

này cung cấp cho bạn ý tưởng như thế nào lớp không được quản lý và wrapper quản lý có thể chơi với nhau. Nếu bạn biết lập trình Qt và biết cách nâng cao sự kiện .NET từ lớp ref C++/CLI, điều này là đủ để thực hiện nhiệm vụ của bạn.

+0

Tôi có tạo lớp thừa kế QObject mới cho mục đích này không? Nếu không, làm cách nào để kết nối lớp được quản lý với tín hiệu Qt? QObject :: connect chỉ chấp nhận QObject * ... Bạn có một ví dụ mã nhỏ không? – notbo

+0

Xin lỗi vì đã ngu ngốc ở đây .. tôi có nên tạo một lớp Qt khác để kết nối với tín hiệu không, và từ vị trí của nó nâng cao sự kiện được quản lý bằng cách nào đó? Lớp Qt này có nên là một phần của dự án C++/CLI của tôi không? Vì điều này cần phải được moc'ed tôi đoán? Và làm thế nào nó sẽ biết về sự kiện được quản lý và nâng cao nó? Có vẻ như bạn đã làm điều này trước khi .. bạn có một số mã để chia sẻ cho thấy làm thế nào để làm điều này? – notbo

+1

Cảm ơn! Bây giờ tôi đã giải quyết vấn đề .. Đối với những người khác có thể đọc sau này .. Có lớp không được quản lý kế thừa từ QObject, để nó có thể kết nối với tín hiệu Qt. Hãy nhớ rằng bạn cần phải MOC lớp không được quản lý (bước xây dựng tùy chỉnh trên tệp có liên quan trong dự án C++/CLI của bạn). – notbo