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である可能性がある場合でも、サブクラスはそれらのメソッドを非スロットとして再実装することを決定できます。

クラス名に2つのタイプミスがあることに注意してください。これはレシーバーであり、レシーバーではなく、インターフェースであり、 intervaceではありませ

于 2012-10-09T16:40:15.097 に答える
1

複数から継承することはできませんQObject。ただし、継承元のクラスはどちらもですQObjects

あなたが考えることができるいくつかの可能性は次のとおりです。

  • クラスに。の代わりにireciver_intervaceから継承させます。このように、から単純に継承できます。(達成したいことによっては不可能な場合があります)QAbstractItemModelQObjectFileItemModelireciver_intervace
  • QAbstractItemModel継承の代わりに委任を使用します。
于 2012-10-09T16:22:41.093 に答える