PDA

View Full Version : QList question



MarkoSan
8th May 2008, 12:30
Hi to all!

I've read the docs about QList (http://doc.trolltech.com/latest/qlist.html) but I did not find any answers regarding my question. So, after QList (http://doc.trolltech.com/latest/qlist.html) method http://doc.trolltech.com/4.3/qlist.html#append, the record is not added to QList (http://doc.trolltech.com/latest/qlist.html). What are possible reasons?

roxton
8th May 2008, 13:50
Can you show a code example?

estanisgeyer
8th May 2008, 14:18
Post part of its code, but you can also use the following:



QList<QString> list;
list << "One" << "Two" << "Three" << "Four";


Marcelo E. Geyer

MarkoSan
8th May 2008, 14:21
This is my code:
m_pShoppingCartView->order()->orders().append(tmpOrder); // adds order to internal qlist
int iOrderSize=m_pShoppingCartView->order()->orders().size(); // calcs size
Q_ASSERT_X(iOrderSize>0, "COperationWindow.cpp", "m_pShoppingCartView->order()->orders().size()<0"); // checks size

The application aborts on Q_ASSERT_X.

wysota
8th May 2008, 14:41
Doesn't by any chance orders() return a copy of the list and not a reference?

MarkoSan
8th May 2008, 14:49
Well, inline function order returns pointer:
inline CMerchandizeOrder* order()
{ return m_pOrder; };m_pOrder is declared as:
CMerchandizeOrder* m_pOrder;and then inline member function orders() returns:
inline QList<structOrder> orders()
{ return m_Orders; };and m_Orders are defined as:
private:
QList<structOrder> m_Orders;

ChristianEhrlicher
8th May 2008, 15:01
inline QList<structOrder> orders()
{ return m_Orders; };
Here you return a copy of the List.

MarkoSan
8th May 2008, 15:04
Well, how do I recode this code so it will work? I do not know how to make a pointer to QList

stevey
9th May 2008, 00:04
Instead of


private:
QList<structOrder> m_Orders;


use


private:
QList<structOrder>* m_Orders;


The are certain key things you need to be aware of with C++.
One very important thing is that when you call return at the end of the function, a COPY of the type you're returning is created to hold the data. This is because any variable declared inside a function is a STACK variable for the scope of that function. So if you declare a non pointer variable then return it, in your case in the call to orders(), you've essentially chained your call to .append(tmpOrder) on a copy of the variable that is lost as soon as the next line is called.

Now by declaring a QList<structOrder>*, at the end of your function you'll be returning a COPY still, but it will be a copy of a POINTER. The actual instantiated QList is on the heap so isn't cleaned up at the end of the function, therefore copied QList*'s data you'll be appending to is valid and won't get lost in transit.

In terms of architecture, you might want to re-consider this kind of thing anyway and use a wrapper function. A sideline of hiding the QList also is that you could schtick with your non pointer version:


void ShoppingCartView::AddOrder(structOrder order)
{
m_Orders.append( order );
}

wysota
9th May 2008, 08:30
Actually he doesn't need a pointer to the list. He needs to return a reference (or pointer) to the list:


inline QList<structOrder> &orders() const { return m_Orders; };

or


inline QList<structOrder> *orders() const { return &m_Orders; };

Of course hiding the implementation detail and exposing a method for adding items to the list as suggested is a much better idea.

MarkoSan
9th May 2008, 13:24
But how do I create a pointer to QList???

The code
m_pOrders=new QList(); // creates new qlist
Q_CHECK_PTR(m_pOrders); // checks creationreturns an compile error.

And I need this info urgently please, since I have a demo of application and the app won't compile neither run because i cannot add items to a non created list!!!!:crying::crying::confused::confused:

MarkoSan
9th May 2008, 13:34
Ok, I've managed to do it. I forgot to pass the type of qlist. Now let me check some things I will report the progress. Thanks for all!

wysota
9th May 2008, 13:52
You don't need to create the list on the heap. Simply return a pointer to the list by using the ampersand.

MarkoSan
17th February 2011, 10:32
Hello, let me continue this thread of mine after 3 years!

I am trying to implement wrapper around QList and when trying to compile following code:
#ifndef BSPITEM_H
#define BSPITEM_H

#include <QObject>
#include <QtCore/QList>

#include "BSPItemProperty.h"

class BSPItem : public QObject
{
Q_OBJECT

private:
QList<BSPItemProperty> m_lsProperties;

public:
explicit BSPItem(QObject *parent = 0);

inline QList<BSPItemProperty>& properties()
{ return this->m_lsProperties; }

void addProperty(const QString& name,
const QVariant& value);
void deleteProperty(const QString& name);
};

#endif // BSPITEM_Hand its implementation - .cpp file:
#include "bspitem.h"

BSPItem::BSPItem(QObject *parent) :
QObject(parent)
{
this->properties().clear();
}

void BSPItem::addProperty(const QString& name,
const QVariant& value)
{
BSPItemProperty tempProperty(this,
name,
value);


this->properties().append(tempProperty);
}

void BSPItem::deleteProperty(const QString& name)
{
for(quint64 iIndex=0; iIndex<(quint64)this->properties().size(); iIndex++)
if(this->properties().at(iIndex).propertyName()==name)
this->deleteProperty(name);
}I get following errors:
Running build steps for project QtBSPPlayer...
Configuration unchanged, skipping qmake step.
Starting: "C:\QtSDK\mingw\bin\mingw32-make.exe" -w
mingw32-make: Entering directory `C:/Users/HP2/Desktop/QtBSPPlayer-build-desktop'
C:/QtSDK/mingw/bin/mingw32-make -f Makefile.Debug
mingw32-make[1]: Entering directory `C:/Users/HP2/Desktop/QtBSPPlayer-build-desktop'
g++ -c -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -I"..\..\..\..\QtSDK\Desktop\Qt\4.7.1\mingw\include\Q tCore" -I"..\..\..\..\QtSDK\Desktop\Qt\4.7.1\mingw\include\Q tGui" -I"..\..\..\..\QtSDK\Desktop\Qt\4.7.1\mingw\include" -I"..\..\..\..\QtSDK\Desktop\Qt\4.7.1\mingw\include\A ctiveQt" -I"debug" -I"..\QtBSPPlayer" -I"." -I"..\..\..\..\QtSDK\Desktop\Qt\4.7.1\mingw\mkspecs\w in32-g++" -o debug\bspitem.o ..\QtBSPPlayer\bspitem.cpp
mingw32-make[1]: Leaving directory `C:/Users/HP2/Desktop/QtBSPPlayer-build-desktop'
mingw32-make: Leaving directory `C:/Users/HP2/Desktop/QtBSPPlayer-build-desktop'
In file included from ..\QtBSPPlayer\/bspitem.h:7,
from ..\QtBSPPlayer\bspitem.cpp:1:
..\..\..\..\QtSDK\Desktop\Qt\4.7.1\mingw\include\Q tCore/qobject.h: In copy constructor 'BSPItemProperty::BSPItemProperty(const BSPItemProperty&)':
..\QtBSPPlayer\/BSPItemProperty.h:9: instantiated from 'void QList<T>::node_construct(QList<T>::Node*, const T&) [with T = BSPItemProperty]'
..\..\..\..\QtSDK\Desktop\Qt\4.7.1\mingw\include/QtCore/qlist.h:499: instantiated from 'void QList<T>::append(const T&) [with T = BSPItemProperty]'
..\QtBSPPlayer\bspitem.cpp:17: instantiated from here
..\..\..\..\QtSDK\Desktop\Qt\4.7.1\mingw\include\Q tCore/qobject.h:309: error: 'QObject::QObject(const QObject&)' is private
..\QtBSPPlayer\/BSPItemProperty.h:9: error: within this context
In file included from ..\..\..\..\QtSDK\Desktop\Qt\4.7.1\mingw\include\Q tCore/qobject.h:50,
from ..\..\..\..\QtSDK\Desktop\Qt\4.7.1\mingw\include\Q tCore/QObject:1,
from ..\QtBSPPlayer\/bspitem.h:4,
from ..\QtBSPPlayer\bspitem.cpp:1:
..\..\..\..\QtSDK\Desktop\Qt\4.7.1\mingw\include/QtCore/qlist.h: In member function 'void QList<T>::node_construct(QList<T>::Node*, const T&) [with T = BSPItemProperty]':
..\..\..\..\QtSDK\Desktop\Qt\4.7.1\mingw\include/QtCore/qlist.h:359: note: synthesized method 'BSPItemProperty::BSPItemProperty(const BSPItemProperty&)' first required here
In file included from ..\QtBSPPlayer\/bspitem.h:7,
from ..\QtBSPPlayer\bspitem.cpp:1:
..\..\..\..\QtSDK\Desktop\Qt\4.7.1\mingw\include\Q tCore/qobject.h: In member function 'BSPItemProperty& BSPItemProperty::operator=(const BSPItemProperty&)':
..\..\..\..\QtSDK\Desktop\Qt\4.7.1\mingw\include\Q tCore/qobject.h:309: error: 'QObject& QObject::operator=(const QObject&)' is private
..\QtBSPPlayer\/BSPItemProperty.h:9: error: within this context
In file included from ..\..\..\..\QtSDK\Desktop\Qt\4.7.1\mingw\include\Q tCore/qobject.h:50,
from ..\..\..\..\QtSDK\Desktop\Qt\4.7.1\mingw\include\Q tCore/QObject:1,
from ..\QtBSPPlayer\/bspitem.h:4,
from ..\QtBSPPlayer\bspitem.cpp:1:
..\..\..\..\QtSDK\Desktop\Qt\4.7.1\mingw\include/QtCore/qlist.h: In member function 'void QList<T>::node_construct(QList<T>::Node*, const T&) [with T = BSPItemProperty]':
..\..\..\..\QtSDK\Desktop\Qt\4.7.1\mingw\include/QtCore/qlist.h:365: note: synthesized method 'BSPItemProperty& BSPItemProperty::operator=(const BSPItemProperty&)' first required here
mingw32-make[1]: *** [debug/bspitem.o] Error 1
mingw32-make: *** [debug] Error 2
The process "C:\QtSDK\mingw\bin\mingw32-make.exe" exited with code 2.
Error while building project QtBSPPlayer (target: Desktop)
When executing build step 'Make'What is wrong??

nightghost
17th February 2011, 10:46
..\..\..\..\QtSDK\Desktop\Qt\4.7.1\mingw\include\Q tCore/qobject.h:309: error: 'QObject::QObject(const QObject&)' is private
..\QtBSPPlayer\/BSPItemProperty.h:9: error: within this context


Are you trying to make a copy of a qobject?

MarkoSan
17th February 2011, 10:48
Are you trying to make a copy of a qobject?I do not think so, but if I do, then I do not know where. If I comment the core of methods addProperty() - append method generates errors and in constructor, clear method generates errors and I simply do not know why. Does these two methods use copy constructor internally??

nightghost
17th February 2011, 10:57
I assume that append creates a copy of the appened object, as well as functions like value

MarkoSan
17th February 2011, 10:59
I assume that append creates a copy of the appened object, as well as functions like valueWell, so what do I do now to get rid of these errors

nish
17th February 2011, 11:57
define a copy constructor in you BP item class