如何在QT中处理c# COM事件

本文关键字:COM 事件 处理 QT | 更新日期: 2023-09-27 18:08:59

我有一个简单的c# COM可见库,看起来像这样:

namespace MyEventClassLibrary {
[Guid("0ab09e18-bf85-48c8-a45d-a0cebed77a5c")]
public interface ICalculator
{
    int Add(int Num1, int Num2);
}
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
[Guid("9e09b634-8c1a-4926-83b2-f6f988595c85")]
public interface ICalculatorEvents
{
    [DispId(1)]
    void Completed(int Result);
}
[ClassInterface(ClassInterfaceType.None)]
[ComSourceInterfaces(typeof(ICalculatorEvents))]
[Guid("6cebc4db-2e8f-4e24-91a5-24ffdf97fc6a")]
public class Calculator : ICalculator
{
    [ComVisible(false)]
    public delegate void CompletedDelegate(int result);
    public event CompletedDelegate Completed;
    public int Add(int Num1, int Num2)
    {
        int Result = Num1 + Num2;
        if (Completed != null)
            Completed(Result);
        return Result;
    }
}}

我注册了它,并将。tlb导入QT:

TYPELIBS = ..'MyEventClassLibrary'MyEventClassLibrary'bin'Debug'MyEventClassLibrary.tlb

mainwindow.cpp文件如下:

#include <QDebug>
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "myeventclasslibrary.h" 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    MyEventClassLibrary::Calculator eventClass;
    connect(&eventClass, SIGNAL(Completed()), this, SLOT(test()));
    qDebug() << eventClass.Add(1,2);
}
void MainWindow::test()
{
    qDebug() << "Here";
}
MainWindow::~MainWindow()
{
    delete ui;
}

当我在QT中构建项目时,我得到了40多个问题:

MyEventClassLibrary.h:144: error: C2535: 'MyEventClassLibrary::CompletedDelegate::CompletedDelegate(void)': member function already defined or declared

MyEventClassLibrary.h:147: error: C2065: 'iface': undeclared identifier

上述问题已通过向委托添加[ComVisible(false)]得到解决(更多信息请参阅注释)

当我运行代码时,我得到一个错误:

QObject::connect: No such signal MyEventClassLibrary::Calculator::Completed()

我的问题是,你如何处理事件/委托在COM和QT?

作为背景信息,QT文档说:

如果COM对象实现了IDispatch接口,那么该对象的属性、方法和事件就可以作为Qt属性、插槽和信号使用。

,我使用了以下资源和研究:

在c++中处理c# COM事件

如何在托管代码中放置IDispatch*

如何在c++中触发c# COM事件?

等等;请帮助!

如何在QT中处理c# COM事件

这个问题有两个部分,目标是在QT中触发一个c# com可见事件:

  1. 当我最初构建QT应用程序时,由于委托可见,我得到了40多个错误。通过在委托声明上方添加[ComVisible(false)]解决了这个问题谢谢你@HansPassant

  2. 当这个问题得到解决时,我试图将插槽连接到COM信号,QT说它找不到Completed事件。这是通过匹配函数原型解决的;Completed有一个参数int,我没有在SLOT函数中包含int。(derp)

我原来的连接是:

connect(&eventClass, SIGNAL(Completed()), this, SLOT(test()));

它应该是:

connect(&eventClass, SIGNAL(Completed(int)), this, SLOT(test(int)));

谢谢!