2

我正在为 Qt 应用程序制作后端模型,并且出于可移植性的考虑(如果我决定废弃 Qt),我使用 boost 作为模型背后的库而不是 Qt。

Qt 有一个很棒的插件系统,它需要使用接口在插件和主应用程序之间进行通信。正因为如此(并且模型的某些部分可以无缝更改),我已经根据实现所有纯虚函数的接口类来定义我的模型。尽管我没有使用 Qt 宏 (QT_DECLARE_INTERFACE) 将它们声明为接口,但我认为在声明给 Qt 的“包装器”接口中使用它们没有问题,这将是未来插件的面孔。

继续我的问题:我在某处读到一个类被认为是 C++ 中的接口,如果 1)它具有除虚拟析构函数之外的所有纯虚拟成员,并且 2)没有成员变量。对我来说,这似乎是纯粹的约定,因为编译器并不关心它是否是一个“接口”类。在对 Qt 插件和接口进行了一些试验和错误之后,在我看来,插件的接口只需要确保它所引用的所有内容都具有一些公共代码库(即,除了由共享库支持的类之外,不使用其他类,除非class 也是一个接口),因此不会有任何未解析的函数。我不确定我是否解释得很好,所以如果需要进一步澄清,我可以给出。

我的问题是这个因为在我看来 boost 信号只是一个由共享库支持的模板化成员变量(插件也会引用 boost),我可以在注定用于 Qt 接口的类中使用 boost 信号吗?兼容插件?

代码示例

我知道这个类可能可以被 Qt 插件接口引用:

class IBlock
{
public:
    virtual ~IBlock() {}

    virtual int getId() = 0;
    virtual std::string getGroup() = 0;
    virtual std::string getName() = 0;
    //etc...
};

但是这个也可以吗?

#include "iblockinput.h" //just another interface I made. relationship is: block has many inputs
#include <boost/smart_ptr.hpp>
#include <boost/signals2.hpp> //signals2 is both thread safe and doesn't make the Qt moc angry

class IBlock
{
public:
    virtual ~IBlock() {}

    virtual int getId() = 0;
    virtual std::string getGroup() = 0;
    virtual std::string getName() = 0;
    //etc...

    boost::signals2::signal<void (boost::weak_ptr<IBlockInput>)> sigInputAdded; //there are 4 of these
};

如果可以的话,这将非常方便,因为尽管 Qt 不允许将 Qt 信号放入接口中(moc 将使用最终无法解析的代码填充它),但它允许它们被字符串名称引用。据我所知,Boost 不允许整个字符串引用,因此在将插槽附加到接口对象时,能够将信号作为普通变量引用会真正清理干净。

4

0 回答 0