Наследование двух интерфейсов с сигналами и слотами в QT5 - PullRequest
0 голосов
/ 27 марта 2020

В настоящее время я пытаюсь наследовать от двух интерфейсов.
Первый определяет все сигналы, второй - все соответствующие слоты, которые будут использоваться для отображения результатов вызовов функций сигналов.

// Like the input of the System
class A : public QObject
{
    Q_OBJECT

    Signals : 
        void signalA();
        ....
        void signalN();
};
// The output of the System
class B : public QObject 
{
    Q_OBJECT

    public slots:
        virtual void slotA();
        ...
        virtual void slotN();
};

В конце мне нужно несколько классов, наследующих класс A или класс B, но также должно быть возможно наследовать A и B как:

// Can be used as Input and Output at the same time for example a GUI
class C : public A, public B // will not work
{
    Q_OBJECT
    public slots:
        void slotA() override;
        ...
        void slotN() override;
};

Итак, Class C должен реализовывать слоты, но также иметь возможность излучать сигналы из класса А.

В моем Main я бы создал два списка QL со всеми «входами» (классы, наследующие A) и всеми «выходами» ( Классы, наследующие B).
Списки передаются контроллеру, который соединяет все входные сигналы с обрабатывающими их слотами, и все результаты этой обработки должны быть добавлены к выходным слотам.
Поэтому C следует добавить для обоих списков, так как он может использоваться как вход и выход.

Это будет выглядеть так:

int main()
{
 QList<A*> inputs;
 QList<B*> outputs;
 C* c = new C();
 inputs.append(c);
 outputs.append(c);

 Controller* controll = new Controller(inputs, outputs);
 ...
}

Но я не могу наследовать оба класса, потому что я бы наследовал QObject дважды.
С другой стороны, я не могу создать интерфейсы без QObject, потому что я не смогу использовать классы, наследующие только один из интерфейсов, так как один из них пропустил бы QObject.

Создание третьего интерфейса и копирование всех сигналов из A и слотов из B было бы возможно, но на самом деле это не то, чего я хочу.

Так есть ли какое-нибудь решение, которое я мог бы попытаться сделать этой работой?

...