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

时间:2018-03-16 09:10:55

标签: qt dbus qtdbus qdbusxml2cpp

我正在使用qdbusxml2cpp工具为我的D-Bus服务器生成D-Bus adaptor class。但是,它有以下缺点:

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

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

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

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

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

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

请注意,我不仅需要使用方法,还需要使用属性和信号。

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

1 个答案:

答案 0 :(得分:4)

正如您所发现的那样,没有办法直接用qdbusxml2cpp做您想做的事。这意味着我们在这里有一些选项,一些您已经列出的选项:

  

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

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

  

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

根据代码生成器的工作情况,我有时会发现简单地使用生成的代码作为起点,然后简单地从那里修改代码就更容易了。大多数chages一般都很简单。

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

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

不幸的是,并没有真正的好'#34;对"做到这一点的方式,所以我担心我没有这样做"这样做"答案。