2013-03-02 41 views
21

我的Qt應用程序出現問題。我試圖從另一個類中發出一個信號(它是信號放置的嵌套類)。如何從另一個班發出信號?

我已經連接了一個插槽的信號,這應該很好。但是當我試圖從這個嵌套類內發出這個信號時,我得到編譯器錯誤:

cannot call member function without object

出什麼問題?我在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的信號:

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

「LOW」是否是正確的對象類型? – tmpearce 2013-03-02 16:07:25

+0

LOW是什麼?有一些代碼缺失給你一個適當的分析。 – 2013-03-02 16:09:45

+0

LOW表示Log類 - 我在後面提到的內部類 – lagoru 2013-03-02 16:17:52

回答

34

要了解你要明白信號是如何發出的問題:

它們只是一個非靜態成員函數調用,因此需要調用一個實例(「發件人」)。通常情況下,這個實例是this(如果您從另一個非靜態成員函數發出相同類的信號),所以調用語法成爲沒有任何(文字)實例的普通函數調用。 emit關鍵字是可選的,並且只是一個擴展爲無效的宏。

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

如果從內部類內發射外部類的信號,所述this指針是指:寫在同一類的成員函數,它包含信號時,以下四個版本都是相同內部類的一個實例,因此外部類缺少一些實例。這與在內部類中調用外部類的任何其他函數一樣:編譯器不知道(外部類的)哪個對象實例調用它。所以,你必須寫類似:

emit someLogWriter->signalLogAppend("foo"); 

這裏,someLogWriter是您要發出信號LogWriter實例。

+0

嗯...似乎這是邏輯解釋:)我也試過這樣想,但我用ptr->發出signalLogAppend()後看你的帖子看起來有點愚蠢 - 好吧,謝謝你的幫助! ! – lagoru 2013-03-02 18:17:30

+0

嗯,這很愚蠢,但我認爲它也應該起作用。因爲它被擴展到'ptr-> signalLogAppend()'(注意空間),這應該是有效的。 – leemes 2013-03-02 21:57:15

相關問題