2016-05-23 4 views
1

Ich habe eine relativ einfache Klasse, die ein Layout mit ein paar Widgets (Labels, lineEdits, pushButtons) enthält, das als eine Karte angezeigt wird. Alles funktioniert gut, bis ich versuche, Signale und Slots hinzuzufügen. Die Header-Datei unten kompiliert gut mit den auskommentierten Abschnitten wie gezeigt.Qt Kompilierfehler: C2280: Versuch, eine gelöschte Funktion zu referenzieren

#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(); 

}; 

Wenn die Bits des Codes sind in links, erhalte ich folgende Fehlermeldung:

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

Ich verwende Qt5.3 und Qt Creator. Ich habe versucht, putzen, qmake ausführen und löschen den Build-Ordner ohne Erfolg. Ich bin ratlos!

Dankbar für jeden Einblick in, wie man das repariert, damit ich fortschreiten kann.

+0

Sie können den Qt Signal-/Slots-Mechanismus nicht verwenden, ohne von QObject zu erben und ohne das Makro Q_OBJECT zu verwenden und Ihren Code über den Meta-Objekt-Compiler "moc" auszuführen. –

Antwort

2

Der Kopierkonstruktor von QObject ist privat - oder gelöscht.

An anderer Stelle in Ihrem Code verwenden Sie den Kopierkonstruktor KMLFile, der dann den Kopierkonstruktor QObject aufruft.

Sie könnten den Kopierkonstruktor von KMLFile neu implementieren, aber die beste Lösung ist, es überhaupt nicht zu verwenden.

In Ihrer QList sollten Sie Zeiger auf die KMLFile Objekte statt der Objekte selbst speichern, sofern sie länger als die Liste selbst leben. Oder Sie können QSharedPointer verwenden.

+0

Vielen Dank, das hat mir gerade genug gegeben, um herauszufinden, wie ich das Problem lösen kann. Ich habe die Deklaration meiner QList in 'QList tracks;' geändert und Objekte davon mit 'KMLFile * track = new KMLFile;' instanziiert, und es wird nun gut übersetzt. Vielen Dank! – SeaMouse

+0

@SeaMouse sei vorsichtig. Sie müssen sie an einem oder dem anderen Punkt löschen. Ein Elternteil für jede 'KMLFile' (vermutlich in der Memberfunktion des' QObject'-Vererbers, der die Liste enthält) kümmert sich um den größten Teil des Problems, aber ein 'qDeleteAll()' auf der Liste vor der Zerstörung kann auch lösen es. – coyotte508

+0

Danke für die Erinnerung - das hatte ich vergessen! – SeaMouse

1

QObject hat einen Konstruktor für gelöschte Kopien. Ihre Klasse erstellt einen vom Compiler generierten Kopierkonstruktor. Wenn Sie QObject eine Basis Ihrer Klasse erstellen, versucht der Compiler generierte Kopierkonstruktor für KLMFile, den Konstruktor der gelöschten Kopie der Basisklasse aufzurufen, und das ist, wenn Sie einen Fehler erhalten.

Der Kopierkonstruktor für KLMFile wird bei Bedarf automatisch generiert (dh wenn Sie versuchen, eine Instanz der Klasse zu kopieren), sofern Sie nicht explizit einen eigenen Kopierkonstruktor angeben.

Wenn die Zeile, auf die im Fehler verwiesen wird, in der Nähe einer Kopie der KLMFile Klasse liegt, wäre dies ein starker Hinweis darauf, dass dies der Fall ist.

Verwandte Themen