【问题标题】:Connect Qt signal in dll with C# application将 dll 中的 Qt 信号与 C# 应用程序连接起来
【发布时间】:2012-08-07 10:07:44
【问题描述】:

我有一个导出插槽和函数的 dll,我还有一些从 dll 中的一些私有函数发出的信号。如果有帮助的话,这个 dll 就是一个 COM 组件。

首先,当我在 Visual Studio 2010 中添加参考时,我导出了完整的 QT 类并且可以看到我的公共插槽和函数,但我看不到信号(不知道我是否应该这样做)。它们用“Q_SIGNALS”声明。

我想要的是将这些信号之一连接到我的 C# 项目中的方法,就像在 QT 中插入信号一样,但现在我需要“信号 (QT)”到“方法 (C#)”之类的东西,是这可能吗?任何帮助表示赞赏。

C++ (Qt)
signals:
  void mySignal(const QString& path);

应该连接到:

C# (VS2010)
void myFunction(string path);

【问题讨论】:

  • 有可用于 Qt 的 C# 绑定可能会解决此问题。 (我认为绑定项目称为京都。)

标签: c# qt dll signals


【解决方案1】:

您在导出的 Qt 类中看不到信号,因为它们不是该类的函数。它不是任何类型的 C(++) 声明。只是一个命名占位符,Qt 预处理器使用它来生成调用代码,以防信号实际连接到某个地方。一个信号然后可以变成两个不同但简单的东西,这取决于线程上下文。信号发送对象是否与接收对象在同一个线程中:

  1. 确实如此:编译为简单的直接方法调用
  2. 它没有:槽调用存储在接收方的消息队列中,并在接收方的线程返回消息循环时执行。 “插槽”也就是所谓的“事件处理程序”

所以对于案例 1,您实际上根本不需要 Qt 语法糖。只需从 Qt 中您将执行 emit mySignal() 的位置调用您的 C# 方法。但是,情况 2 不能像 Qt 那样简单,因为接收器必须继承 QObject(我不知道在 C# 中可能)。您仍然可以使用处理程序滚动您自己的消息循环,但 Qt 不会帮助您。

【讨论】:

  • 好吧,我明白了,我也注意到了。如何从我的 qt dll 中“简单地调用我的 C# 方法”?我猜你的意思是某种回调方法?我现在正在用我的 COM dll 尝试这个,但每次我将 typedef 添加到我的参数列表时,函数都会从导出的列表中消失......
  • 你在哪里添加typedef?什么功能消失了?如果您的基于 Qt 的 dll 是 COM,您不能以某种方式使用 COM 进行互操作吗?我对 COM 几乎一无所知。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 2014-02-03
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 2015-12-11
相关资源
最近更新 更多