gpt4 book ai didi

qt - 如何在托管 C++ (C++/CLI) 中将 Qt 信号映射到事件

转载 作者:行者123 更新时间:2023-12-02 03:36:22 25 4
gpt4 key购买 nike

我正在 .NET (C++/CLI) 中编写一个包装器,以便能够在 .NET 中使用一些 native C++ Qt 代码。如何将 Qt 信号映射到托管 .NET 事件中,以便当我的 Qt 代码触发信号时,我可以将其转发到 .NET 代码。

我的托管类定义了事件,但是如果我尝试使用普通的 QObject::connect 方法来连接信号,它需要一个 QObject * 接收器...我想我必须对一些事件进行一些神奇的编码排序?

最佳答案

定义普通的非托管 Qt 事件处理程序。从此处理程序引发托管事件。

编辑:如果您以前有 Qt 经验,您就知道如何在非托管类中处理 Qt 信号。不要试图让这个类受到管理。相反,请编写包含此 QObject 派生类的 C++/CLI 包装器。

编辑2.创建C++/CLI控制台应用程序,将其命名为test1,并向其中添加以下代码:

测试1.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 onceclass UnmanagedClass;// Wrapperref 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 classclass UnmanagedClass{public:    UnmanagedClass(ManagedClass^ pWrapper);    ~UnmanagedClass(void);    void Test();private:    gcroot m_pWrapper;};

非托管类.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 编程并且知道如何从引用 C++/CLI 类引发 .NET 事件,这足以完成您的任务。

关于qt - 如何在托管 C++ (C++/CLI) 中将 Qt 信号映射到事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3915289/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com