2013-03-02 6 views
21

Qtアプリケーションに問題があります。私は別のクラス(信号が配置されているクラスのネストされたクラス)からシグナルを放出しようとしています。別のクラスからどのように信号を放射できますか?

すでに信号をスロットに接続していますが、これは問題ありません。しかし、このネストされたクラスの中からこの信号を出そうとすると、コンパイラエラーが発生します。

cannot call member function without object

何が問題なのですか?私はQtのドキュメントでそれを探しましたが、合理的な解決策や説明を見つけることができませんでした。

簡略化されたクラス定義は、次のようになります。あなたは信号が放出されるかを理解しなければならない問題を理解するために

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

'LOW'は正しいタイプのオブジェクトですか? – tmpearce

+0

LOWとは何ですか?あなたに適切な分析を与えるためにいくつかのコードがありません。 –

+0

LOWはLogクラスを表しています。ポスト – lagoru

答えて

34

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の信号を接続します:

これらは単に非静的メンバー関数呼び出しであり、インスタンスを呼び出す必要があります( "送信者")。通常、このインスタンスはthisです(別の非スタティックメンバー関数の中で同じクラスの信号を発信する場合)。そのため、コール構文は、(リテラル)インスタンスを持たない通常の関数呼び出しになります。 emitキーワードはオプションで、単に何も展開されないマクロです。

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

あなたが内部クラス内から外部クラスの信号を発する場合、thisポインタが指す:シグナルを含む同じクラスのメンバー関数で記述された場合は、次の4つのバージョンは、すべて同じです内部クラスのインスタンスであり、したがって、外部クラスに対してインスタンスが欠落しています。内部クラスの中から外部クラスの他の関数を呼び出す場合と同じです。コンパイラは、(外部クラスの)オブジェクトインスタンスを呼び出すことを知りません。だからあなたのようなもの書くことがあります。ここでは

emit someLogWriter->signalLogAppend("foo"); 

を、someLogWriterは、あなたが信号を発信したいLogWriterのインスタンスです。

+0

ええと...これは論理的な説明だと思われます:)私はそのように考えようとしましたが、ptr-> signalLogAppend()を使用しました。あなたの投稿を読んだ後、ちょっと愚かです。 ! – lagoru

+0

まあ、ばかですが、私はそれもうまくいくと思います。有効なはずの 'ptr-> signalLogAppend()'(スペースに注意)に展開されるためです。 – leemes

関連する問題