QT-Problem für Profis
-
Ich bin gerade dabei eine QLinkedList<groups> zu erstellen, die wie der Name schon sagt aus Objekten der Klasse groups besteht.
Jedes Objekt vom Typ groups besitzt eine weitere QLinkedList<devices>, die aus Objekten der Klasse devices besteht. Eine verkettete Liste in einer verketteten Liste also.
Über main() erstelle ich 3 Elemente vom Typ groups und füge diese in die Liste QLinkedList<groups> ein. Alle drei Elemente erhalten 3 devices.
Mein Problem ist das Auslesen der einzelnen Gruppen. Ich möchte die devices einer jeden Gruppe auslesen.
Hier main():#include <QtGui/QApplication> #include <QtCore/QCoreApplication> #include "mainwindow.h" #include "groups.h" #include <QLinkedList> #include <iostream> #include <QDebug> using namespace std; int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); QLinkedList<groups> myList; QLinkedList<groups>::iterator iter; QString Group1("Group1"); QString Group2("Group2"); QString Group3("Group3"); myList.append(Group1); myList.append(Group2); myList.append(Group3); QString Device1("Device1"); QString Device2("Device2"); QString Device3("Device3"); iter=myList.begin(); //In erste Gruppe schreiben iter->adddevice(Device1); iter->adddevice(Device2); iter->adddevice(Device3); iter++; //In zweite Gruppe schreiben iter->adddevice(Device1); iter->adddevice(Device2); iter->adddevice(Device3); iter++; //In dritte Gruppe scheiben iter->adddevice(Device1); iter->adddevice(Device2); iter->adddevice(Device3); for(iter = myList.begin(); iter!= myList.end(); ++iter) { w.addParent(iter->getname()); //Alle Gruppennamen auslesen und als Parent eintragen. w.addChild("Schirm1"); for (iter->getdeviceiter() = iter->getdevice().begin(); iter->getdeviceiter()!=iter->getdevice().end(); ++iter->getdeviceiter()) { w.addChild(iter->getdeviceiter()->getname2()); //Alle Devicenamen auslesen und als Child in richtige Gruppe eintragen. } } return a.exec(); }
hier die groups.cpp
#include "groups.h" groups::groups() {} groups::groups(QString pname) { name=pname; } QString groups::getname() { return name; } QLinkedList<devices>::iterator groups::getdeviceiter() { return devIt; } void groups::adddevice(QString dname) { device.append(dname); } QLinkedList<devices> groups::getdevice() { return device; } groups::~groups() { }
Hier die groups.h
#ifndef GROUPS_H #define GROUPS_H #include <QString> #include "devices.h" #include <QLinkedList> class groups { public: groups(); groups(QString pname); QString getname(); void adddevice(QString dname); QLinkedList<devices> getdevice(); QLinkedList<devices>::iterator getdeviceiter(); ~groups(); private: QString name; QLinkedList<devices> device; QLinkedList<devices>::iterator devIt; }; #endif // GROUPS_H
Hier die device.cpp
#include "devices.h" devices::devices() {} devices::devices(QString name) { dname = name; } QString devices::getname2() { return dname; } devices::~devices() {}
und folglich die device.h
#ifndef DEVICES_H #define DEVICES_H #include <QString> class devices { public: devices(); devices(QString name); ~devices(); QString getname2(); private: QString dname; }; #endif // DEVICES_H
Die einzelnen Gruppen und Devices möchte ich in ein QTreeWidget schreiben.
Die Gruppen sind hierbei die übergeordnete Struktur und mit jedem Klick auf die Gruppe sollen die einzelnen Devices sichtbar werden.Mein Problem ist folgendes. Das Fenster mit dem TreeWidget öffnet sich, jedoch erscheint die Fehlermeldung "Der Prozess wurde nach Erhalt eines Signals vom Betriebssystem angehalten. Name des Signals: SIGSEGV Bedeutung: Segmentation fault.
Der Debugger zeigt dann die Zeilen wie folgend an:
erste Ebene: int main() 52 - das ist der Aufruf w.addChild(iter->getdevi...
zweite Ebene: devices.cpp 10 - in dieser Zeile steht return dname;
dritte Ebene: 725 qstring.h - hier wird die qstring.h file geöffnet und in dieser Zeile steht:
inline QString::QSstring(const QString &other) : d(other.d)
{Q_ASSERT(&other != this); d->ref.ref();}Hab gegoogelt und es scheint wohl ein Pointerproblem zu sein.
Ich hoffe irgend jemand kann mir helfen.
Vielen Dank.Liebe Grüße,
Melli
-
was mir beim ersten überfliegen aufgefallen ist, du machst:
QString Group1("Group1"); ... myList.append(Group1); ...
willst aber:
groups Group1("Group1"); ... myList.append(Group1); ...
selbiges bei den devices.
da QString wohl keine getName() - methode hat wirds beim zugriff über den
iterator bums machen.
-
@Psycho: Quatsch. Das funktioniert, weil groups einen entsprechenden Konstruktor hat. Und wenn QString keinen getName() hätte (hat es auch nicht, du verstehst den Code einfach nicht), dann würde das nicht kompilieren und nicht zur Laufzeit crashen. C++ ist kein dynamische Sprache.
Ich seh auf den ersten Blick keinen Fehler, bin jetzt aber nach 12 Stunden leicht überarbeitet. Musst einfach kurz durchdebuggen und schauen, was passiert und wo du einen ungültigen Zeiger hast.
p.s. @Melanie: Ach ja. Ich mag deine Namensgebung nicht (Klassen sollte man schon groß schreiben, und irgendwie sollte man Wörter auch trennen und nicht einfach alles klein zusammen schreiben). Und ich mag schon gar nicht, dass du Parameter nicht als konstante Referenzen übergibst.
-
@Mechanics: jup hast recht, hatte ich auch nicht verstanden
aber mal ne frage zum code und ob ichs richtig spann: wird nicht überall wo die string - objekte "weitergereicht" werden ne kopie gemacht? oder blick ich das da auch wieder nit richtig?
-
Wie meinst du? Von den QString Objekten wird eine Kopie gemacht. Ist aber nicht ganz so schlimm, weil QString wie die meisten Qt Klassen mit shared data arbeitet und keine Daten kopiert. Trotzdem sollte man QString als konstante Referenz übergeben, hab ich ja geschrieben.
-
Ich habe die Rückgabeparameter der Funktionen const gemacht, ändert aber leider gar nichts
Kann mir denn niemand helfen?
lg. Melli
-
Debuggs halt durch. Debuggen ist eh sehr wichtig, also lerns gleich. Das Problem ist sicher trivial, musst nur durchgehen, was passiert.