2016-05-23 907 views
1

我有一個相對簡單的類,其中包含一些帶有少量小部件(標籤,lineEdits,pushButtons)的佈局,並顯示爲一張卡片。這一切工作正常,直到我嘗試添加信號和插槽。下面的頭文件可以很好地用註釋掉的部分進行編譯,如圖所示。Qt編譯錯誤:C2280:試圖引用一個已刪除的函數

#include <QString> 
#include <QObject> 
#include <QWidget> 

class KMLFile //: public QObject 
{ 
    //Q_OBJECT 
public: 
    KMLFile(); 
    ~KMLFile(); 

    QString m_originalFilename; 
    QString m_originalPath; 
    QString m_proposedFilename; 
    QString m_propsoedPath; 
    QString m_coords; 
    QWidget* trackWidget; 

    void populate(QString originalFilename, QString originalPath, QString proposedFilename, QString coords); 
    QString getCoords(); 
    int getLength(); 

//public slots: 
    //void changeFilename(); 

}; 

當這些代碼位左邊在上,我得到以下錯誤:

"C:...\qlist.h:425: error: C2280: 'KMLFile::KMLFile(const KMLFile &)': attempting to reference a deleted function

我使用Qt5.3和Qt Creator。我試圖清理,運行qmake並刪除生成文件夾無濟於事。我很難過!

感謝任何深入瞭解如何解決這個問題,以便我可以進步。

+0

如果不從QObject繼承而不使用Qt的信號/槽機制,也不能使用Q_OBJECT宏並通過「moc」元對象編譯器運行代碼。 –

回答

2

QObject的拷貝構造函數是私有的 - 或者被刪除。

您代碼中的其他位置使用KMLFile的複製構造函數,然後調用QObject的複製構造函數。

您可以重新實現KMLFile的拷貝構造函數,但最好的解決方案是根本不使用它。

在你的QList你應該存儲指向KMLFile對象的指針,而不是對象本身,只要它們的壽命比列表本身長。或者你可以開始使用QSharedPointer

+0

非常感謝,這讓我足夠了解如何解決問題。我將QList的聲明更改爲'QList tracks;'並用'KMLFile * track = new KMLFile;'實例化它的對象,現在編譯好了。非常感謝你! – SeaMouse

+0

@SeaMouse要小心。您需要在某個點或另一個點刪除它們。給每個'KMLFile'(大概在包含列表的'QObject'繼承者的成員函數中)給父對象處理大部分問題,但是在列表被銷燬之前在列表中執行'qDeleteAll()'也可以解決它。 – coyotte508

+0

感謝您的提醒 - 我忘記了這麼做! – SeaMouse

1

QObject有一個刪除的拷貝構造函數。你的類正在創建一個編譯器生成的拷貝構造函數。當您將QObject作爲您的類的基礎時,編譯器生成的KLMFile的複製構造函數會嘗試調用基類的已刪除副本構造函數,即出現錯誤時。

KLMFile的複製構造函數將自動生成,如果需要(即如果您嘗試複製類的實例),除非您明確指定您自己的複製構造函數。

如果錯誤中引用的行接近KLMFile類的副本,這將是一個強有力的指示器,表明情況屬實。

相關問題