Seite 1 von 1

Konversion von QStringList zu QList<QStandardItem>

Verfasst: 6. Juli 2010 11:26
von Illuminatus
Hi
Leute und zwar gehts um folgenden Code:

Code: Alles auswählen

            // List represents a Row
            QStringList elements = text.split(";:");

            // Conversion to QList item
            QList<QStandardItem> itemsList;
            //qDebug() << elements;
            for(int i = 0; i< elements.size(); i++)
            {
                QString string = elements.at(i);
                QStandardItem item(string);
                itemsList.append(item);
            }


Ich bekomme folgende Fehler:

Code: Alles auswählen

/Library/Frameworks/QtGui.framework/Versions/4/Headers/qstandarditemmodel.h:: In member function 'void QList<T>::append(const T&) [with T = QStandardItem]':



/Users/ ... /QT/STC-build-desktop/../STC/src/CSVReader.cpp:38: error:   instantiated from here

/Library/Frameworks/QtGui.framework/Versions/4/Headers/qstandarditemmodel.h:240: error: 'QStandardItem::QStandardItem(const QStandardItem&)' is protected
/Library/Frameworks/QtCore.framework/Headers/qlist.h:478: error: within this context

/Library/Frameworks/QtGui.framework/Versions/4/Headers/qstandarditemmodel.h:: In member function 'void QList<T>::node_construct(QList<T>::Node*, const T&) [with T = QStandardItem]':

/Library/Frameworks/QtCore.framework/Headers/qlist.h:472: error:   instantiated from 'void QList<T>::append(const T&) [with T = QStandardItem]'
...



Verfasst: 6. Juli 2010 11:39
von franzf
Als Tip für die Zukunft, den du dir unbedingt merken solltest:

Code: Alles auswählen

error: 'QStandardItem::QStandardItem(const QStandardItem&)' is protected 
hat den genialen Hintergedanken, QStandardItem nicht kopierbar zu machen. Du wirst das noch öfters bekommen (versuch mal ein QObject zu kopieren, also keinen Zeiger auf ein QObject).
Die einzige Lösung um solche nicht-kopierbaren Sachen in einen Container (QList, ...) zu stopfen, sind Zeiger, denn per Value werden solche Objekte natürlich immer in den Container kopiert.

Also:
QList<QStandardItem> -> QList<QStandardItem *>

Ein value hat in dem Fall eh wenig Sinn, da QStandardItemModel selber die Items nur per Zeiger entgegennimmt kannst dir viel unangenehme Effekte holen, wenn intern umkopiert werden müsste und dabei die Adresse eines QStandardItems nicht mehr die alte wäre, QStandardItemModel aber noch darauf zugreifen will -> BOOM CRASH ;)
Deshalb ist das Kopieren von QStandardItems wohl auch verboten ;)

Verfasst: 6. Juli 2010 11:43
von Illuminatus
Genial!!!
Vielen vielen Dank!! ich komm aus der java ecke, deshalb muss ich da no en bissel umdenken