Qt Liste erzeugen mit Template QList<QObject> bzw. QList<QObject *>



  • Hallo liebe User!

    Habe bislang in der managed .net Welt entwickelt und jetzt versuche ich mich in C++ mit dem Qt Framework.

    Kann mir bitte jemand ausführlich erklären warum ich eine QList so:

    QList<QObject> myQList;
    

    nicht anlegen kann aber so:

    QList<QObject *> myQList;
    

    dafür schon?

    Bei

    QList<QString> myQList;
    

    funktioniert das, weshalb?

    Habe eine englische Erklärung gefunden, der genaue Hintergrund ist mir aber unklar:

    ---QObject copy constructor is private to QObject
    ---so unaccessible to QList
    ---
    ---you can only use QList<QObject *>

    Danke und viele Grüße



  • Was genau ist dein Problem? Kannst du nicht gut genug C++, um das zu verstehen, oder verstehst du nicht, warum Qt das so gemacht hat?

    QObjects sind nicht kopierbar, der Copy Constructor und der Assignment Operator sind privat. Das ist der technische Grund, warum man sie nicht als Objekte in einer Liste oder was auch immer verwalten kann. Ist dir das soweit klar? QStrings sind ganz normale Value Typen.
    Dass QObjects nicht kopierbar sein sollen, ist eine bewußte Designentscheidung von Qt, dafür gibts mehrere Gründe.



  • Was genau ist dein Problem? Kannst du nicht gut genug C++, um das zu verstehen, oder verstehst du nicht, warum Qt das so gemacht hat?

    Ich wollte die Community um eine genaue Erklärung bitten. In diesem Fall wie müssen die Konstruktoren spezifiziert werden, damit dieses Verhalten, beim Erzeugen von Containern erreicht wird.

    QList<Class> bzw. QList<Class*>
    

    Ich könnte natürlich lange recherchieren aber ich finde jede Frage bereichert das Forum, egal wie einfach sie ist!

    Also falls du das noch genauer behandeln könntest wäre ich dankbar!



  • nullxff schrieb:

    In diesem Fall wie müssen die Konstruktoren spezifiziert werden, damit dieses Verhalten, beim Erzeugen von Containern erreicht wird.

    Mechanics schrieb:

    QObjects sind nicht kopierbar, der Copy Constructor und der Assignment Operator sind privat. Das ist der technische Grund, warum man sie nicht als Objekte in einer Liste oder was auch immer verwalten kann.



  • Ich verstehe deine Frage oder dein problem immer noch nicht.

    QObject ist eine Basisklasse, die die Basis für alle anderen Qt Klassen darstellt. So in etwa wie Object in Java.
    Der hauptgrund dafür ist laut Doku der Signal/Slots Machanismus, der so zwischen allen Qt-Objekten ermöglicht wird.

    Und QList scheint laut Doku ein ganz normaler Container für Daten zu sein, mit bestimmten Garantien was Laufzeiten bzw. Zugriffszeiten angeht.
    Und benutzen tust du die in etwa so:

    QList<int> integers;
    integers.push_back(0);
    std::cout << integers[0];
    

    Wo ist also dein Problem?

    ~(Ich kenne Qt nur vom hören sagen, hab nie damit gearbeitet, nur grad mal Doku gelesen)~



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (alle ISO-Standards) in das Forum Andere GUIs - Qt, GTK+, wxWidgets verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Es gibt keinen einzigen Grund, eine QList mit QObject-Elementen zu erstellen, deswegen braucht es niemand.
    Erstelle doch einfach eine neue Klasse MyObject mit Basisklasse QObject. In MyObject musst du den Kopierkonstruktor und Zuweisungsoperator implementieren und schon funktionert QList mit MyObject.

    Der Grund steht hier:
    http://doc.qt.io/qt-4.8/object.html#qt-objects-identity-vs-value



  • nullxff schrieb:

    Ich könnte natürlich lange recherchieren aber ich finde jede Frage bereichert das Forum, egal wie einfach sie ist!

    Ich habe erstmal nichts gegen die Frage gesagt, ich verstehe sie nur nicht genau. Du könntest hier unterschiedliche Probleme haben, ich weiß ja nicht genau, was dir nicht klar ist, und ich kann auch deinen Kenntnisstand nicht einschätzen.

    Du kommst aus der .NET Welt, also ist es nicht unwahrscheinlich, dass du erstmal Probleme mit der Sprache (C++) hast. In .NET gibts die Unterscheidung zwischen Objekten und Zeigern/Referenzen nicht. Ist dir genau klar, was der Unterschied zwischen QList<QString> und QList<QString*> ist und was passiert, wenn du jeweils einen neuen QString in die Liste einfügst?
    Ich vermute nämlich, dass dir das nicht klar ist, sonst würdest du deine Frage anders stellen. Warum sich Qt entschieden hat, QObjects nicht kopierbar zu machen, ist auch eine berechtigte Frage, aber eine ganz andere.


Anmelden zum Antworten