2016-05-23 68 views
1

私は、カードとして表示されるウィジェット(labels、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を継承せず、Q_OBJECTマクロを使用せずにコードを "moc"メタオブジェクトコンパイラで実行することなく、Qtのシグナル/スロット機構を使用することはできません。 –

答えて

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クラスのコピーの近くにある場合。

関連する問題