私はこのようになりますシンプルなC#のCOM見えライブラリがあります。QTでC#COMイベントを処理するには?
TYPELIBS = ..\MyEventClassLibrary\MyEventClassLibrary\bin\Debug\MyEventClassLibrary.tlb
と私の mainwindow.cpp:私はそれを登録して、私はQTに.TLBをインポートする必要があり
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;
}
}}
をファイルには、次のようになります。
#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の+ ISSを取得します線に沿ってのUE:上記のデリゲートに[のComVisible(偽)]を追加することで解決されてい
MyEventClassLibrary.h:144: error: C2535: 'MyEventClassLibrary::CompletedDelegate::CompletedDelegate(void)': member function already defined or declared
と
MyEventClassLibrary.h:147: error: C2065: 'iface': undeclared identifier
(詳細はコメントを参照してください)
コードを実行すると、次のエラーが発生します。
QObject::connect: No such signal MyEventClassLibrary::Calculator::Completed()
私の質問は、どのようにCOM/QTでイベント/代理人を扱うのですか?
は、背景情報として、QTドキュメントは言う:COMオブジェクトはIDispatchインタフェースを実装
場合、そのオブジェクトのプロパティ、メソッド、およびイベントはQtのプロパティ、スロット及び信号として利用可能になります。
と私は資源や研究として、以下を使用しました:
how to put IDispatch* in managed code
How to fire c# COM events in c++?
とより。助けてください!
生成された.hファイルについて何も知らずに、実装があまりにも多く見えるように思えます。 CompletedDelegate型はまったく表示しないでください。プロジェクト]> [プロパティ]> [アプリケーション]タブ> [アセンブリ情報]ボタンをクリックし、[アセンブリをCOMに表示]オプションの選択を解除します。 [ComVisible(true)]属性は、表示されるべき宣言、インタフェース、およびクラスに対してのみ適用します。または、デリゲートに[ComVisible(false)]を適用します。 –
ありがとう@HansPassant、私が直面したエラーの猛攻撃を修正しました。それは今コンパイルされ、_Add(int、int)_メソッドを呼び出すことができますが、私はまだできないし、_Completed_イベントをインスタンス化してアクセスする方法が不明です。私は 'connect(&eventClass、SIGNAL(Completed())、this、SLOT(test()));'を試みましたが、それは正しいとは思われません。 具体的には、次のエラーが発生します。** QObject :: connect:そのようなシグナルがありません。MyEventClassLibrary :: Calculator :: Completed()** – Anduril28
この問題の解決方法を知っていますか?だからQ + Aを記入して答えを受け取り、それを受け入れる。その後、[質問する]ボタンをクリックして、次の問題のヘルプを求めます。 –