繁体   English   中英

Qt接口类

[英]Qt interfaces class

如何创建接口类,如下所示:

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

具有信号/槽功能的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,子类也可以决定将这些方法重新实现为非槽!

请注意,您有两个错字在你的类名:这是接收器 ,不reciver和它的接口 ,而不是intervace。

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

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

  • 让类ireciver_intervace继承自QAbstractItemModel而不是QObject 这样, FileItemModel可以简单地从ireciver_intervace继承。 (可能无法取决于你想要达到的目标)
  • 使用委托进行QAbstractItemModel而不是继承。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM