2

我有一个导出插槽和函数的 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);
4

1 回答 1

1

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

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

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

于 2012-08-07T12:12:47.047 回答