Можно ли излучать сигнал из базового класса производного объекта, используя "это"


Не слишком уверен, как сформулировать мой вопрос, и я надеюсь, что это более ясно. Я хочу иметь базовый класс, который выглядит примерно так:

class Base : public QObject { 
    Q_OBJECT


    void doSomething() { emit test(this); }

    virtual void doSomethingElse() = 0;

signals:
     void test(Base*);
}

А затем в производном классе сделайте следующее:

 class Derived : public Base {

     void doSomethingElse() { emit test(this); }

 }

Если я сейчас слушаю сигналы этого объекта и слушаю ли я тест (производный*) или/и тест(базовый*)?

3 2

3 ответа:

Moc генерирует во время компиляции список слотов и сигналов на основе того, как вы объявили их в классах, использующих макрос Q_OBJECT.
Этот список является списком строк, поэтому если вы объявили:

signals:
     void test(Base*);

Элементом в списке будет строка "test(Base*)" (Вы можете увидеть этот список в переменной qt_meta_YourClass файла moc_yourclass.cpp в выходном каталоге).
макросы SIGNAL и SLOT также возвращают строки, connect() канонизируют их, чтобы они были отформатированы так, как это сделано в MOC. список, и сравнивает их с теми, кто в этом списке.

Когда вы производите класс, строка не изменилась, поэтому вам все еще нужно использовать SIGNAL(test(Base*)).

Не следует включать отправителей в параметры сигналов. Вы можете просто использовать QObject::sender(), чтобы получить QObject, который послал сигнал.

Например:

emit test();

Затем в прорезь:

void Listener::someObject_test() {
    QObject* sender = QObject::sender();
    // or:
    Derived* sender = (Derived*)QObject::sender();
}

Поскольку производный класс не имеет собственного сигнала, вы будете слушать тест (Base*).