2011-11-23 23 views
1

當我嘗試返回值時,在我的smtdplugin實現文件中出現此錯誤。好吧,我明白我創建一個指向QAction的指針,當我嘗試返回它時,我無法這樣做,因爲我的方法正在等待對象的引用。但我不知道如何行動(我是一個begginer) 如何避免這個問題? ,併成功返回該對象無法從'QAction *'轉換爲'QAction'

#include "smtdplugin.h" 

QAction SmtdPlugin::newItem() { 

QAction *item = new QAction(NULL); 

    return item; // here i get error 
} 

Q_EXPORT_PLUGIN2(smtdplugin,SmtdPlugin); 

頭文件

#ifndef SMTDPLUGIN_H 
#define SMTDPLUGIN_H 

#include <QObject> 
#include <QAction> 
#include "smtdinterface.h" 

class SmtdPlugin : public QObject,SmtdInterface { 

    Q_OBJECT 
    Q_INTERFACES (SmtdInterface) 

public : 
    QAction newItem(); 

}; 

#endif // SMTDPLUGIN_H 

接口類:

#ifndef SMTDINTERFACE_H 
#define SMTDONINTERFACE_H 

#include <QAction> 

class SmtdInterface { 

public: 
    virtual ~SmtdInterface() {} 
    SmtdInterface(); 
    virtual QAction newItem() = 0; 

}; 

Q_DECLARE_INTERFACE(SmtdInterface,"com.trololo.Plugin.SmtdInterface/1.0") 

#endif 

回答

1

當你做return item,你正在返回一個指針QAction,但根據該函數的聲明你返回一個QAction,因此錯誤。

所以,你應該做的:

QAction* SmtdPlugin::newItem() { 

    QAction *item = new QAction(NULL); 

    return item; 
} 
+0

由於答案解決了問題,我不會低估它。 Downvote會首先提出建議。 QAction是QObject,所以它不能被複制。並且您的退貨聲明會嘗試複印,並且無法編譯 –

+0

請刪除您的第一個消音,因爲它是無效的 –

+0

@KamilKlimek:完成。謝謝。 –

2

我呆在一起熟悉QT但誤差 -

QAction* SmtdPlugin::newItem() // Return type should be QAction* and not QAction 
{ 

    QAction *item = new QAction(NULL); 

    return item; 
} 

的類型是QAction *而不是QAction這是編譯器正在抱怨。我認爲你對這個空間感到困惑。

QAction* item ; // QAction * item ; QAction *item ; 

以上三種約定都是相同的。

+0

在你的情況,你正在返回一個指向對象的指針,但成員函數的返回類型表示它返回一個對象。一個指向一個對象的指針和它自己的對象是兩種不同的類型,並且不一樣。 – Mahesh

0

如果您需要在堆上創建的行動,那麼它可能是最好的只是返回的值更改爲的QAction *。

0

在你的代碼,返回這是QAction*類型的項目:

return item; // here i get error 

,但你的函數簽名要求您返回的QAction:

QAction SmtdPlugin::newItem() { 

爲了解決這個矛盾,要麼改變功能簽名到

QAction* SmtdPlugin::newItem() { 

或 更改您的功能的概念,以便它不會再針對一個指針。