`QObject::QObject(const QObject&) is private`

Qt Programmierung, QML, Qt-Plattformen
Antworten
Ü-Ei
Beiträge: 20
Registriert: Mo Apr 21, 2014 1:31 pm

`QObject::QObject(const QObject&) is private`

Beitrag von Ü-Ei » Sa Dez 06, 2014 9:10 pm

Hi,

ich habe den Fehler `QObject::QObject(const QObject&) is private`.
Ich weiß schon, dass das daher führt, dass ich irgendwo versuche QObject zu kopieren.
Das Problem ist ich weiß nicht wo, da ich dies auch überhaupt nicht beabsichtige.
Ich will nur eine Klasse, die ein paar Werte speichert und sich bequem mit qSort sortieren
lässt.
Ich glaube der Fehler ist bei den Operatoren "<" und "==". Bin mir da aber nicht sicher, aber
ich weiß, dass ich die in dieser Form brauche, damit mir die Liste sauber nach Datum sortiert
wird.

Terminojekt.h

Code: Alles auswählen

#ifndef TERMINOBJEKT_H
#define TERMINOBJEKT_H

#include <QObject>
#include <QString>
#include <QDate>

class Terminobjekt : public QObject
{
    Q_OBJECT

    Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
    Q_PROPERTY(QString monat READ monat WRITE setMonat NOTIFY monatChanged)
    Q_PROPERTY(QString tagaswort READ tagaswort WRITE setTagaswort NOTIFY tagaswortChanged)
    Q_PROPERTY(int tagaszahl READ tagaszahl WRITE setTagaszahl NOTIFY tagaszahlChanged)
    Q_PROPERTY(QString ort READ ort WRITE setOrt NOTIFY ortChanged)
    Q_PROPERTY(QString beschreibung READ beschreibung WRITE setBeschreibung NOTIFY beschreibungChanged)

public:
    Terminobjekt(QObject *parent);
    Terminobjekt(const QString Name, const int Type, const QDate Datum, const QString Ort, const QString Beschreibung);

    QString name();
    void setName(QString &name);

    QString monat();
    void setMonat(QString &monat);

    QString tagaswort();
    void setTagaswort(QString &tag);

    int tagaszahl();
    void setTagaszahl(int &tag);

    QString ort();
    void setOrt(QString &ort);

    QString beschreibung();
    void setBeschreibung(QString &beschreibung);

    QDate datum();
    void setDatum(QDate &Datum);

    bool operator< (const Terminobjekt &other) const;
    bool operator==(const Terminobjekt &other) const;

private:
    QString _Name;
    int _Type;
    QDate _Datum;
    QString _Ort;
    QString _Beschreibung;

signals:
    void nameChanged();
    void monatChanged();
    void tagaswortChanged();
    void tagaszahlChanged();
    void ortChanged();
    void beschreibungChanged();
};

#endif // TERMINOBJEKT_H
Terminobjekt.cpp

Code: Alles auswählen

#include "terminobjekt.h"

Terminobjekt::Terminobjekt(QObject *parent = 0 ) : QObject(parent)
{
}

Terminobjekt::Terminobjekt(const QString Name, const int Type, const QDate Datum, const QString Ort, const QString Beschreibung)
{
    _Name = Name;
    _Type = Type;
    _Datum = Datum;
    _Ort = Ort;
    _Beschreibung = Beschreibung;
}

QString Terminobjekt::name()
{
    return _Name;
}

void Terminobjekt::setName(QString &name)
{
    _Name = name;

    emit nameChanged();
}

QString Terminobjekt::monat()
{
    int Monat = _Datum.month();
    QString Out = "";

    switch (Monat) {
    case 1:
        Out = "Januar";
        break;
    case 2:
        Out = "Februar";
        break;
    case 3:
        Out = "März";
        break;
    case 4:
        Out = "April";
        break;
    case 5:
        Out = "Mai";
        break;
    case 6:
        Out = "Juni";
        break;
    case 7:
        Out = "Juli";
        break;
    case 8:
        Out = "August";
        break;
    case 9:
        Out = "September";
        break;
    case 10:
        Out = "October";
        break;
    case 11:
        Out = "November";
        break;
    case 12:
        Out = "Dezember";
        break;
    default:
        break;
    }

    return Out;
}

void Terminobjekt::setMonat(QString &monat)
{
    int Monat = 1;

    switch (monat) {
    case "Januar":
        Monat = 1;
        break;
    case "Februar":
        Monat = 2;
        break;
    case "März":
        Monat = 3;
        break;
    case "April":
        Monat = 4;
        break;
    case "Mai":
        Monat = 5;
        break;
    case "Juni":
        Monat = 6;
        break;
    case "Juli":
        Monat = 7;
        break;
    case "August":
        Monat = 8;
        break;
    case "September":
        Monat = 9;
        break;
    case "October":
        Monat = 10;
        break;
    case "November":
        Monat = 11;
        break;
    case "Dezember":
        Monat = 12;
        break;
    default:
        break;
    }

    _Datum.setDate(_Datum.year(), Monat, _Datum.day());

    emit monatChanged();
}

QString Terminobjekt::tagaswort()
{
    int Tag = _Datum.dayOfWeek();
    QString Out = "";

    switch (Tag) {
    case 1:
        Out = "Montag";
        break;
    case 2:
        Out = "Dinstag";
        break;
    case 3:
        Out = "Mittwoch";
        break;
    case 4:
        Out = "Donnerstag";
        break;
    case 5:
        Out = "Freitag";
        break;
    case 6:
        Out = "Samstag";
        break;
    case 7:
        Out = "Sonntag";
        break;
    default:
        break;
    }

    return Out;
}

void Terminobjekt::setTagaswort(QString &tag)
{
    int Tag = 1;

    switch (tag) {
    case "Montag":
        Tag = 1;
        break;
    case "Dinstag":
        Tag = 2;
        break;
    case "Mittwoch":
        Tag = 3;
        break;
    case "Donnerstag":
        Tag = 4;
        break;
    case "Freitag":
        Tag = 5;
        break;
    case "Samstag":
        Tag = 6;
        break;
    case "Sonntag":
        Tag = 7;
        break;
    default:
        break;
    }

    _Datum.setDate(_Datum.year(), _Datum.month(), Tag);

    emit tagaswortChanged();
}

int Terminobjekt::tagaszahl()
{
    return _Datum.day;
}

void Terminobjekt::setTagaszahl(int &tag)
{
    _Datum.setDate(_Datum.year(), _Datum.month(), tag);

    emit tagaszahlChanged();
}

QString Terminobjekt::ort()
{
    return _Ort;
}

void Terminobjekt::setOrt(QString &ort)
{
    _Ort = ort;

    emit ortChanged();
}

QString Terminobjekt::beschreibung()
{
    return _Beschreibung;
}

void Terminobjekt::setBeschreibung(QString &beschreibung)
{
    _Beschreibung = beschreibung;

    emit beschreibungChanged();
}

QDate Terminobjekt::datum()
{
    return _Datum;
}

void Terminobjekt::setDatum(QDate &Datum)
{
    _Datum = QDate(Datum);

    emit monatChanged();
    emit tagaswortChanged();
    emit tagaszahlChanged();
}

bool Terminobjekt::operator< (const Terminobjekt & other) const
{
    return _Datum < *other.datum();
}

bool Terminobjekt::operator== (const Terminobjekt & other) const
{
    return _Datum == *other.datum();
}

nufan
Wiki-Moderator
Beiträge: 2526
Registriert: Sa Jul 05, 2008 3:21 pm

Re: `QObject::QObject(const QObject&) is private`

Beitrag von nufan » So Dez 07, 2014 5:09 pm

Ich bekomme mehrere Compiler-Fehler, aber nicht den von dir genannten.

Code: Alles auswählen

error: switch quantity not an integer
     switch (monat) {
Du kannst in C++ switch nicht auf Strings anwenden. Für den Vergleich musst du if verwenden oder dir was anderes überlegen (Map).
Dieser Fehler kommt mehrere Male vor und ich hab die entsprechenen Stellen vorübergehend einfach mal gelöscht.

Code: Alles auswählen

error: cannot convert 'QDate::day' from type 'int (QDate::)() const' to type 'int'
     return _Datum.day;
Hier fehlen die Klammern für den Funktionsaufruf.

Code: Alles auswählen

error: passing 'const Terminobjekt' as 'this' argument of 'QDate Terminobjekt::datum()' discards qualifiers [-fpermissive]
     return _Datum < *other.datum();
Die datum()-Methode muss als const markiert werden.

Code: Alles auswählen

error: no match for 'operator*' (operand type is 'QDate')
     return _Datum < *other.datum();
Ich weiß nicht wofür du hier * verwendest. Das gehört da nicht hin. Genauso bei der Methode darunter.

Danach baut das Ganze bei mir, den QObject-Fehler bekomme ich nicht. Wie legst du deine Terminobjekt-Instanzen an?

Ü-Ei
Beiträge: 20
Registriert: Mo Apr 21, 2014 1:31 pm

Re: `QObject::QObject(const QObject&) is private`

Beitrag von Ü-Ei » So Dez 07, 2014 11:12 pm

Danke schonmal.
Ich finde es komisch, dass er mir den Fehler an eine komplett
anderen Stelle zeigt, als an der, wo ich ihn erzeuge :(

Die Termine sammel ich in einer modifizierten QList.
Die wurde auf anderen Seiten auch schon immer Fehlerursache
genannt. Mitlerweile habe ich schon etwas mehr daran rum
gebastelt und eine menge neue Fehler produziert.

Eine wichtige Änderung, die ich schon vorgenommen habe ist,
dass ich die Terminobjekt nicht mehr als Referenz sondern als
Pointer hinzufüge.

Ich werde die Tage noch die restlichen Fehler tilgen. Hauptmerk
ist die Funktion addTermin, weil ich da ja eine neue Instanz von
Terminobjekt erstelle und zur Liste hinzufüge.

Code: Alles auswählen

#ifndef TERMINDATASTORAGE_H
#define TERMINDATASTORAGE_H

#include <QList>
#include <QObject>
#include <QDate>
#include "terminobjekt.h"

class Termindatastorage : public QList<Terminobjekt*>
{
    Q_OBJECT

    Q_INVOKABLE void addTermin(QString Name, int Type, QString Datum, QString Ort, QString Beschreibung);

public:
    Termindatastorage();
    void addTermin(Terminobjekt* neu);
    void addTermin(QString Name, int Type, QDate Datum, QString Ort, QString Beschreibung);

    void removeTermin(QString Name);
    void removeTermineafter(QDate Datum);

    Terminobjekt getTermin(QString Name);

    void sort();

signals:
    void Terminadded();
};

#endif // TERMINDATASTORAGE_H

Code: Alles auswählen

#include "termindatastorage.h"
#include <QtAlgorithms>


Termindatastorage::Termindatastorage() : QList<Terminobjekt*>()
{
}

void Termindatastorage::addTermin(Terminobjekt* neu)
{
    this->append(neu);
    this->sort();

    emit Terminadded();
}

void Termindatastorage::addTermin(QString Name, int Type, QDate Datum, QString Ort, QString Beschreibung)
{
    Terminobjekt* neu = new Terminobjekt(Name, Type, Datum, Ort, Beschreibung);
    this->append(neu);
    this->sort();

    emit Terminadded();
}

void Termindatastorage::removeTermin(QString Name)
{
    /*for(int i = 0; i<this->count(); i++){
        if(this->at(i).name()==Name){
            this->removeAt(i);
            return;
        }
    }*/
}

void Termindatastorage::removeTermineafter(QDate Datum)
{
    /*for(int i = 0; i<this->count(); i++){
        if(this->at(i).datum()<Datum){
            this->removeAt(i);
        }
    }*/
}

void Termindatastorage::sort()
{
    qSort(this->begin(), this->end());
}

void Termindatastorage::addTermin(QString Name, int Type, QString Datum, QString Ort, QString Beschreibung)
{
    QDate dat = QDate::fromString(Datum, "dd.mm.yyyy");
    Terminobjekt* neu = new Terminobjekt(Name, Type, dat, Ort, Beschreibung);
    this->append(neu);
    this->sort();

    emit Terminadded();
}

nufan
Wiki-Moderator
Beiträge: 2526
Registriert: Sa Jul 05, 2008 3:21 pm

Re: `QObject::QObject(const QObject&) is private`

Beitrag von nufan » So Dez 07, 2014 11:32 pm

Ü-Ei hat geschrieben:Eine wichtige Änderung, die ich schon vorgenommen habe ist,
dass ich die Terminobjekt nicht mehr als Referenz sondern als
Pointer hinzufüge.
Wenn du ein Objekt an die QList übergibst wird es über den Copy-Constructor kopiert. QList erwartet sich ein QObject, also wird der QObject::QObject(const QObject&)-Konstruktor aufgerufen, der aber privat ist. Lösen kannst du das wie du schon richtig erkannt hast über Zeiger.

Ü-Ei
Beiträge: 20
Registriert: Mo Apr 21, 2014 1:31 pm

Re: `QObject::QObject(const QObject&) is private`

Beitrag von Ü-Ei » Mo Dez 08, 2014 9:32 pm

Leider kommen jetzt die nächsten Probleme, bei denen ich versuche auf eine private Funktion zu zu greifen.
Ich komme nicht darauf klar, da wenn ich es nicht in einer modifizierten QList benutzen würde, würde es gehen :oops:
Zudem meint Qt, dass die QList keine Methode 'staticMetaObjekt'

Liegt das an qSort? Anders kann ich mir das nicht erklären :(

Terminliste.h

Code: Alles auswählen

#ifndef TERMINLISTE_H
#define TERMINLISTE_H

#include <QList>
#include <QString>
#include <QDate>
#include "terminobjekt.h"

class Terminliste : public QList<Terminobjekt*>
{
    Q_OBJECT

    Q_INVOKABLE void addTermin(QString name, int status, int tag, int monat, int jahr, QString zeit, QString ort, QString beschreibung);

public:
    Terminliste();
    void addTermin(QString Name, int Status, QDate Datum, QString Bildname, QString Ort, QString Beschreibung);
    void sort();
};

#endif // TERMINLISTE_H

Code: Alles auswählen

#include "terminliste.h"
#include <QtAlgorithms>
#include <QTime>

Terminliste::Terminliste() : QList<Terminobjekt*>()
{
}

void Terminliste::addTermin(QString Name, int Status, QDate Datum, QString Bildname, QString Ort, QString Beschreibung)
{
    Terminobjekt* neu = new Terminobjekt(Name, Status, Datum, Ort, Beschreibung);
    this->append(neu);
}

void Terminliste::sort()
{
    qSort(this->begin(), this->end());
}

void Terminliste::addTermin(QString name, int status, int tag, int monat, int jahr, QString zeit, QString ort, QString beschreibung)
{
    QDate Datum(jahr, monat, tag);

    Terminobjekt* neu = new Terminobjekt(name, status, Datum, ort, beschreibung);
    this->append(neu);
}


nufan
Wiki-Moderator
Beiträge: 2526
Registriert: Sa Jul 05, 2008 3:21 pm

Re: `QObject::QObject(const QObject&) is private`

Beitrag von nufan » Mo Dez 08, 2014 9:56 pm

Was versuchst du denn überhaupt mit diesen ganzen Qt-Makros wie Q_INVOKABLE, Q_PROPERTY usw. zu erreichen? Verwendest du QtScript?
Außerdem hast du ein Q_OBJECT-Macro in deinem Header, obwohl deine Klasse nicht von QObject ableitet. Also entweder Q_OBJECT streichen oder von QObject ablbeiten (in der Reihenfolge vor QList!).

Falls du die Macros und die Ableitung von QObject wirklich brauchst, schaut das also so aus:

Code: Alles auswählen

#ifndef TERMINLISTE_H
#define TERMINLISTE_H

#include <QList>
#include <QString>
#include <QDate>
#include "terminobjekt.h"

class Terminliste : public QObject, public QList<Terminobjekt*>
{
    Q_OBJECT

    Q_INVOKABLE void addTermin(QString name, int status, int tag, int monat, int jahr, QString zeit, QString ort, QString beschreibung);

public:
    Terminliste();
    void addTermin(QString Name, int Status, QDate Datum, QString Bildname, QString Ort, QString Beschreibung);
    void sort();
};

#endif // TERMINLISTE_H

Ü-Ei
Beiträge: 20
Registriert: Mo Apr 21, 2014 1:31 pm

Re: `QObject::QObject(const QObject&) is private`

Beitrag von Ü-Ei » Mi Dez 10, 2014 8:40 pm

Danke läuft jetzt einwandfrei :D

Ich brauche QObjekt um es in QML einbinden zu können.
Aber soweit ich weiß ist der pluginloader für beide engines gleich.

Antworten