1

我怎样才能创建一个接口类,像这样:

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宏?

4

2 回答 2

3

不能对具有信号/槽功能的 QObject 子类进行模板化。

您可以简单地删除接口的 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,子类也可以决定将这些方法重新实现为非插槽!

请注意,您的类名中有两个拼写错误:它是receiver,而不是reciver,它是interface,而不是intervece

于 2012-10-09T16:40:15.097 回答
1

你不能从多个继承QObject。但是,您继承的两个类都是QObjects.

您可以考虑的一些可能性如下:

  • 让类ireciver_intervace继承自QAbstractItemModel而不是QObject. 这样,FileItemModel可以简单地继承自ireciver_intervace. (可能无法实现,具体取决于您想要实现的目标)
  • 使用委托QAbstractItemModel代替继承。
于 2012-10-09T16:22:41.093 回答