Класс интерфейсов Qt

Как я могу создать интерфейсный класс, что-то вроде этого:

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 макрос?

1

Решение

Подклассы 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, подкласс может принять решение повторно реализовать эти методы как не-слоты!

Обратите внимание, что в названии вашего класса есть две опечатки: получатель, не ресивер И его интерфейс, не intervace.

3

Другие решения

Вы не можете наследовать от более чем одного QObject, Однако оба класса, от которых вы наследуете, QObjects,

Некоторые возможности, которые вы могли бы рассмотреть, следующие:

  • Пусть класс ireciver_intervace наследовать от QAbstractItemModel вместо QObject, Сюда, FileItemModel может просто наследовать от ireciver_intervace, (может быть невозможным в зависимости от того, чего вы хотите достичь)
  • Использовать делегирование для QAbstractItemModel вместо наследования.
1

По вопросам рекламы [email protected]