Ответ 1
Чтобы понять проблему, вы должны понимать, как излучаются сигналы:
Они просто нестационарный вызов функции функции и, следовательно, требуют вызова экземпляра ( "отправитель" ). Обычно этот экземпляр this
(если вы излучаете сигнал из другой нестатической функции-члена того же класса), поэтому синтаксис вызова становится обычным вызовом функции без экземпляра (буквального), Ключевое слово emit
является необязательным и представляет собой просто макрос, который расширяется до нуля. Следующие четыре версии одинаковы, если они записаны в функции-члене того же класса, который содержит сигнал:
emit this->signalLogAppend("foo");
emit signalLogAppend("foo");
this->signalLogAppend("foo");
signalLogAppend("foo");
Если вы излучаете сигнал внешнего класса внутри внутреннего класса, указатель this
ссылается на экземпляр внутреннего класса, и, таким образом, для внешнего класса отсутствует некоторый экземпляр. Это то же самое, как если бы вы вызывали любую другую функцию внешнего класса из внутреннего класса: компилятор не знает, на каком экземпляре объекта (внешнего класса) называть его. Поэтому вам нужно написать что-то вроде:
emit someLogWriter->signalLogAppend("foo");
Здесь someLogWriter
- это экземпляр LogWriter
, для которого вы хотите испустить сигнал.