2014-10-31 50 views
0

我在班上有一些信號,名稱爲requestFinished
另外我有插槽_finished,它應該激活該信號。
但我有錯誤undefined reference to MY_SIGNAL
這裏是_finished對SOME_SIGNAL_NAME的未定義引用

void VK::_finished(QNetworkReply *reply) { 
    if (reply->error() != QNetworkReply::NoError) { 
     qDebug() << (QString) reply->readAll(); 
    } else { 
     QString json(reply->readAll()); 
     VKResponse *response = new VKResponse(json); 
     VKError *error = new VKError(json); 
     VKAnswer *answer = new VKAnswer(error, response); 
     emit requestFinished(answer); 
    } 
} 

這裏是VK類:

class VK { 
    public: 
     VK(QString token); 
     void request(QString method, std::map<QString, QString> data); 
     ~VK(); 

    private: 
     QString token; 

    private slots: 
     void _finished(QNetworkReply *reply); 

    signals: 
     void requestFinished(VKAnswer *answer); 
}; 

正如你所看到的,它包含方法requestFinished的信號。我的問題是什麼?謝謝。

+2

你的問題在'VK'類聲明中缺少'Q_OBJECT'宏。 – vahancho 2014-10-31 12:34:59

+0

我刪除它,因爲我得到錯誤'未定義的引用VK'VIN'與它。谷歌說我這是虛擬方法的問題,但我沒有他們。 //對不起我的英文 – Efog 2014-10-31 12:36:54

+1

'VK'也必須是'QObject'的子類用於信號/插槽工作 – 2014-10-31 12:41:36

回答

3

你VK類需要公開繼承QObject的,包括Q_OBJECT作爲第一件事情:

class VK: public QObject { 
    Q_OBJECT 
    public: 
     VK(QString token); 
     void request(QString method, std::map<QString, QString> data); 
     virtual ~VK(); 

    private: 
     QString token; 

    private slots: 
     void _finished(QNetworkReply *reply); 

    signals: 
     void requestFinished(VKAnswer *answer); 
}; 

,那麼你將需要確保商務部正在對運行(通常這是自動的在QtCreator)

+0

感謝您的諮詢。我添加了'Q_OBJECT',並從'QObject'繼承了類。現在我有錯誤'未定義VK'的引用。 // upd:解決。我在析構函數中添加了'virtual',現在所有工作都正常。謝謝! – Efog 2014-10-31 12:42:37