web-dev-qa-db-ja.com

別のクラスから信号を発信するにはどうすればよいですか?

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

次の関数呼び出しを使用して、クライアントコードのLogWriterのインスタンスLOWの信号をいくつかのスロットに接続します。

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

この問題を理解するには、信号の発信方法を理解する必要があります。

それらは単に非静的メンバー関数呼び出しであるため、インスタンスを呼び出す必要があります(「送信者」)。通常、このインスタンスはthis同じクラスの別の非静的メンバー関数内から信号を発行する場合)であるため、呼び出し構文は(リテラル)インスタンス。 emitキーワードはオプションであり、単に何も展開しないマクロです。次の4つのバージョンは、信号を含む同じクラスのメンバー関数で記述された場合、すべて同じです。

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

内部クラス内から外部クラスの信号を発行する場合、thisポインターは内部クラスのインスタンスを参照するため、外部クラスの一部のインスタンスが欠落しています。これは、内部クラス内から外部クラスの他の関数を呼び出す場合と同じです。コンパイラは、(外部クラスの)どのオブジェクトインスタンスを呼び出すかを知りません。そのため、次のようなものを書く必要があります。

emit someLogWriter->signalLogAppend("foo");

ここで、someLogWriterは、信号を発信するLogWriterのインスタンスです。

44
leemes