Можно ли излучать сигнал из базового класса производного объекта, используя "это"
Не слишком уверен, как сформулировать мой вопрос, и я надеюсь, что это более ясно. Я хочу иметь базовый класс, который выглядит примерно так:
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 ответа:
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(); }