如何在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应用程序时,由于委托可见,我得到了40多个错误。通过在委托声明上方添加[ComVisible(false)]解决了这个问题谢谢你@HansPassant
-
当这个问题得到解决时,我试图将插槽连接到COM信号,QT说它找不到Completed事件。这是通过匹配函数原型解决的;Completed有一个参数int,我没有在SLOT函数中包含int。(derp)
我原来的连接是:
connect(&eventClass, SIGNAL(Completed()), this, SLOT(test()));
它应该是:
connect(&eventClass, SIGNAL(Completed(int)), this, SLOT(test(int)));
谢谢!