如何创建接口类,如下所示:
template<typename file_system_t>
class ireciver_intervace : public QObject
{
public:
typedef typename file_system_t::file_system_item file_system_item;
public Q_SLOTS:
virtual void dataChangeItem(file_system_item *item)=0;
virtual void removeItem(file_system_item *item)=0;
virtual void insertItem(file_system_item *item)=0;
};
和派生类
class FileItemModel:public QAbstractItemModel ,public ireciver_intervace<file_system>
{
Q_OBJECT
}
当我继承本课程时,我会收到一个错误,提到模糊的转换。我理解这是编译器的正确行为,但是如何为未来的类获取接口槽?也许我必须使用Q_DECLARE_INTERFACE
宏?
答案 0 :(得分:3)
QObject subclasses with signal/slot functionality can't be templated.
您可以简单地删除界面的QObject继承,其余的都可以。定义一个(纯)虚函数然后(在子类中)通过将它放在子类的slots
部分中来创建一个插槽是没有问题的:
template<typename file_system_t>
class ireceiver_interface
{
public:
typedef typename file_system_t::file_system_item file_system_item;
// pure virtual functions (NO SLOTS!):
virtual void dataChangeItem(file_system_item *item)=0;
virtual void removeItem(file_system_item *item)=0;
virtual void insertItem(file_system_item *item)=0;
};
class FileItemModel: public QAbstractItemModel,
public ireceiver_interface<file_system_t>
{
Q_OBJECT
...
public slots:
// implementations (slots):
virtual void dataChangeItem(file_system_item *item);
virtual void removeItem(file_system_item *item);
virtual void insertItem(file_system_item *item);
...
}
但是,接口的概念是定义具体类必须实现的功能。这里,接口不能强制子类将那些函数定义为插槽,它也可以将它们定义为非插槽函数。这个小问题无法解决。即使接口可能是QObject,子类也可以决定将这些方法重新实现为非插槽!
请注意,您的班级名称中有两个拼写错误:它是接收器,而不是 reciver ,它是接口,不是 intervace 。
答案 1 :(得分:1)
您不能从多个QObject
继承。但是,您继承的两个类都是QObjects
。
您可以考虑的一些可能性如下:
ireciver_intervace
继承QAbstractItemModel
而不是QObject
。这样,FileItemModel
可以简单地从ireciver_intervace
继承。 (可能无法取决于你想要达到的目标)QAbstractItemModel
继承。