我正在为Qt应用程序制作后端模型并且为了便携性(我应该决定废弃Qt)我使用boost作为模型后面的库而不是Qt。
Qt有一个很棒的插件系统,需要使用接口在插件和主应用程序之间进行通信。因此(以及模型的某些部分可以无缝更改)我已经根据实现所有纯虚函数的接口类来定义我的模型。虽然我没有使用Qt宏(QT_DECLARE_INTERFACE)将它们声明为接口,但我没有看到在向Qt声明的“包装器”接口中使用它们的问题,这将是未来插件的面孔。
支持我的问题:我在某处读到一个类被认为是C ++中的接口,如果1)它具有除虚拟析构函数之外的所有纯虚拟成员,并且2)没有成员变量。对我来说,这似乎是纯粹的约定,因为编译器不关心它是否是一个“接口”类。经过Qt插件和接口的一些试验和错误之后,我认为插件的接口只需要确保它引用的所有东西都有一些共同的代码库(即除了共享库支持的类之外的其他类) class也是一个接口),因此不存在任何未解析的函数。我不确定我是否在解释这个问题,所以如果需要进一步澄清,我可以给它。
我的问题是这个由于升压信号在我看来只是一个由共享库支持的模板化成员变量(插件也会引用boost),我可以在类中使用boost信号在Qt兼容插件的接口中使用?
代码示例
我知道这个类可能可以被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不允许这整个字符串引用的东西,所以能够将信号作为普通变量引用,在将插槽附加到接口对象时会真正清理它。