我们可以生成抽象的Qt D-Bus适配器类吗?

Tho*_*mas 6 qt dbus qtdbus qdbusxml2cpp

我正在使用该qdbusxml2cpp工具为我的D-Bus服务器生成D-Bus适配器类.但是,它有以下缺点:

  • 代码生成一次,然后您不应该修改它.但是,如果我们必须进行更改(见下文)然后更改XML(当然是以向后兼容的方式),该怎么办?

  • 假设"适配器"具有与D-Bus接口完全相同的功能和签名.就我而言,这并不完全正确,例如,某些方法的命名方式不同.由于生成的代码使用QMetaObject::invokeMethod,因此仅在运行时检测到.如果我们将来需要重新生成代码,我们就无法明智地修改生成的代码.

在我看来,如果qdbusxml2cpp生成一个抽象类,只是一个标题,所有方法都是纯虚拟的,那就更好了.然后我可以编写一个类的实现,只需调用适配器上的正确方法,而无需通过Qt元类型系统.这解决了两个问题:

  • 如果XML发生变化,我们只需重新生成标题.现在编译器会抱怨,直到我们正确实现新接口.

  • 我们可以自由地在"adaptee"类中调用我们喜欢的任何函数,而不是保持与公共D-Bus接口中完全相同的签名.

我找不到上述任何工具或qdbusxml2cpp叉子.在我自己编写之前,上述方法是否存在任何问题,我可能会忽略,设计方面还是技术方面?也许元类型系统的局限性与抽象类或纯虚函数有关?

请注意,我需要这不仅可以使用方法,还可以使用属性和信号.

我还考虑编写一个包含"adaptee"的"中间"适配器,并提供D-Bus适配器所需的确切接口,但D-Bus适配器仍将使用元类型系统和运行时检查.当然,我们可以做得更好.

rm5*_*248 4

正如您所发现的,没有办法qdbusxml2cpp直接做您想做的事情。这意味着我们这里有一些选择,其中一些您已经列出了:

在我看来,如果qdbusxml2cpp生成一个抽象类,只是一个标头,其中所有方法都是纯虚拟的,那就更好了。

尽管某些工具/IDE 可能无法很好地使用它,但这似乎没有什么严重的错误。这样做的一个缺点是,每当发生变化时,您都必须确保更新 C++ 源代码的所有部分,而不仅仅是标头,例如,如果添加新方法时必须更改样板文件。

代码生成一次,之后您不应该对其进行修改。但是,如果我们必须进行更改(见下文),然后 XML 发生更改(当然以向后兼容的方式),该怎么办?

根据代码生成器的工作情况,我有时发现简单地使用生成的代码作为起点,然后简单地从那里修改它会更容易。大多数变化通常都非常简单。

您可以做的另一种选择是使用不同的库来进行 DBus 通信。

我使用(并维护)dbus-cxx;包含一个工具(dbus-cxx-xml2cpp),它生成类似于输出的适配器类,qdbusxml2cpp因为适配器类只是调用处理实际响应的不同类。缺点是 xml2cpp 工具不是那么智能,并且不会总是输出正确的代码。要在 Qt 应用程序中使用 dbus-cxx,您需要关闭 Qt 关键字。但是,它确实具有使用模板化函数的优点,因此如果您的签名不正确,您将收到编译错误。

不幸的是,实际上并没有一个好的“正确”方法来做到这一点,所以我担心我没有“这样做”的答案。