34

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

1 に答える 1

55

この問題を理解するには、シグナルの送信方法を理解する必要があります。

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

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

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

emit someLogWriter->signalLogAppend("foo");

ここで、シグナルを発信したいsomeLogWriterインスタンスです。LogWriter

于 2013-03-02T16:41:03.137 に答える