Можно ли излучать сигнал из базового класса производного объекта, используя «this» - PullRequest
3 голосов
/ 22 марта 2012

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

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); }

 }

Если я сейчас слушаю сигналы этого объекта и слушаю ли я тест (Derived *) или / и тест (Base *)?

Ответы [ 3 ]

2 голосов
/ 22 марта 2012

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

signals:
     void test(Base*);

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

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

1 голос
/ 22 марта 2012

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

например:

emit test();

Затем в слоте:

void Listener::someObject_test() {
    QObject* sender = QObject::sender();
    // or:
    Derived* sender = (Derived*)QObject::sender();
}
0 голосов
/ 22 марта 2012

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

...