Как я могу создать интерфейсный класс, что-то вроде этого:
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, подкласс может принять решение повторно реализовать эти методы как не-слоты!
Обратите внимание, что в названии вашего класса есть две опечатки: получатель, не ресивер И его интерфейс, не intervace.
Вы не можете наследовать от более чем одного QObject
, Однако оба класса, от которых вы наследуете, QObjects
,
Некоторые возможности, которые вы могли бы рассмотреть, следующие:
ireciver_intervace
наследовать от QAbstractItemModel
вместо QObject
, Сюда, FileItemModel
может просто наследовать от ireciver_intervace
, (может быть невозможным в зависимости от того, чего вы хотите достичь)QAbstractItemModel
вместо наследования.