Подтвердить что ты не робот

Как я могу испустить сигнал из другого класса?

У меня проблема с моим приложением Qt. Я пытаюсь испустить сигнал из другого класса (это вложенный класс того, в котором размещен сигнал).

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

не может вызвать функцию-член без объекта

Что не так? Я искал это в документации Qt, но не мог найти разумного решения или даже объяснения.

Упрощенное определение класса выглядит следующим образом.

class LogWriter : public QDialog
{   
   Q_OBJECT

public:
   class Log : public QObject
   {
      Q_OBJECT

   public:
      bool print;

      Log(bool _print, QString _color, QObject *obj = NULL)
         : QObject(obj)
      {
         print = _print;
         color = _color;
      }
   };

   LogWriter(QWidget * parent = 0);
   ~LogWriter();

public slots:
   void setMinVal();
   void setMediumVal();
   void setHighVal();
   void cleanWindow();
   void appendText(QString &text);

signals:
   void signalLogAppend(QString);
};

Я подключаю сигнал экземпляра LOW для LogWriter в клиентском коде к некоторому слоту, используя следующий вызов функции:

connect(&LOW, SIGNAL(signalLogAppend(QString)),
        this, SLOT(appendText(QString&)),
        Qt::DirectConnection);
4b9b3361

Ответ 1

Чтобы понять проблему, вы должны понимать, как излучаются сигналы:

Они просто нестационарный вызов функции функции и, следовательно, требуют вызова экземпляра ( "отправитель" ). Обычно этот экземпляр this (если вы излучаете сигнал из другой нестатической функции-члена того же класса), поэтому синтаксис вызова становится обычным вызовом функции без экземпляра (буквального), Ключевое слово emit является необязательным и представляет собой просто макрос, который расширяется до нуля. Следующие четыре версии одинаковы, если они записаны в функции-члене того же класса, который содержит сигнал:

emit this->signalLogAppend("foo");
emit signalLogAppend("foo");
this->signalLogAppend("foo");
signalLogAppend("foo");

Если вы излучаете сигнал внешнего класса внутри внутреннего класса, указатель this ссылается на экземпляр внутреннего класса, и, таким образом, для внешнего класса отсутствует некоторый экземпляр. Это то же самое, как если бы вы вызывали любую другую функцию внешнего класса из внутреннего класса: компилятор не знает, на каком экземпляре объекта (внешнего класса) называть его. Поэтому вам нужно написать что-то вроде:

emit someLogWriter->signalLogAppend("foo");

Здесь someLogWriter - это экземпляр LogWriter, для которого вы хотите испустить сигнал.