簡體   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