Hi to all!
I've read the docs about QList but I did not find any answers regarding my question. So, after QList method http://doc.trolltech.com/4.3/qlist.html#append, the record is not added to QList. What are possible reasons?
Hi to all!
I've read the docs about QList but I did not find any answers regarding my question. So, after QList method http://doc.trolltech.com/4.3/qlist.html#append, the record is not added to QList. What are possible reasons?
Qt 5.3 Opensource & Creator 3.1.2
Can you show a code example?
Post part of its code, but you can also use the following:
Qt Code:
QList<QString> list; list << "One" << "Two" << "Three" << "Four";To copy to clipboard, switch view to plain text mode
Marcelo E. Geyer
This is my code:Qt 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 sizeTo copy to clipboard, switch view to plain text mode
The application aborts on Q_ASSERT_X.
Qt 5.3 Opensource & Creator 3.1.2
Doesn't by any chance orders() return a copy of the list and not a reference?
Well, inline function order returns pointer:m_pOrder is declared as:Qt Code:
inline CMerchandizeOrder* order() { return m_pOrder; };To copy to clipboard, switch view to plain text modeand then inline member function orders() returns:Qt Code:
CMerchandizeOrder* m_pOrder;To copy to clipboard, switch view to plain text modeand m_Orders are defined as:Qt Code:
inline QList<structOrder> orders() { return m_Orders; };To copy to clipboard, switch view to plain text modeQt Code:
private: QList<structOrder> m_Orders;To copy to clipboard, switch view to plain text mode
Qt 5.3 Opensource & Creator 3.1.2
Well, how do I recode this code so it will work? I do not know how to make a pointer to QList
Qt 5.3 Opensource & Creator 3.1.2
Instead of
Qt Code:
private: QList<structOrder> m_Orders;To copy to clipboard, switch view to plain text mode
use
Qt Code:
private: QList<structOrder>* m_Orders;To copy to clipboard, switch view to plain text mode
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:
Qt Code:
void ShoppingCartView::AddOrder(structOrder order) { m_Orders.append( order ); }To copy to clipboard, switch view to plain text mode
Last edited by stevey; 8th May 2008 at 23:20.
Actually he doesn't need a pointer to the list. He needs to return a reference (or pointer) to the list:
Qt Code:
inline QList<structOrder> &orders() const { return m_Orders; };To copy to clipboard, switch view to plain text mode
or
Qt Code:
inline QList<structOrder> *orders() const { return &m_Orders; };To copy to clipboard, switch view to plain text mode
Of course hiding the implementation detail and exposing a method for adding items to the list as suggested is a much better idea.
But how do I create a pointer to QList???
The codereturns an compile error.Qt Code:
Q_CHECK_PTR(m_pOrders); // checks creationTo copy to clipboard, switch view to plain text mode
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!!!!![]()
Qt 5.3 Opensource & Creator 3.1.2
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!
Qt 5.3 Opensource & Creator 3.1.2
You don't need to create the list on the heap. Simply return a pointer to the list by using the ampersand.
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:and its implementation - .cpp file:Qt Code:
#ifndef BSPITEM_H #define BSPITEM_H #include <QObject> #include <QtCore/QList> #include "BSPItemProperty.h" { Q_OBJECT private: QList<BSPItemProperty> m_lsProperties; public: inline QList<BSPItemProperty>& properties() { return this->m_lsProperties; } void addProperty(const QString& name, const QVariant& value); void deleteProperty(const QString& name); }; #endif // BSPITEM_HTo copy to clipboard, switch view to plain text modeI get following errors:Qt Code:
#include "bspitem.h" { 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); }To copy to clipboard, switch view to plain text modeWhat is wrong??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 \QtCore" -I"..\..\..\..\QtSDK\Desktop\Qt\4.7.1\mingw\include \QtGui" -I"..\..\..\..\QtSDK\Desktop\Qt\4.7.1\mingw\include " -I"..\..\..\..\QtSDK\Desktop\Qt\4.7.1\mingw\include \ActiveQt" -I"debug" -I"..\QtBSPPlayer" -I"." -I"..\..\..\..\QtSDK\Desktop\Qt\4.7.1\mingw\mkspecs \win32-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'
Qt 5.3 Opensource & Creator 3.1.2
Are you trying to make a copy of a qobject?..\..\..\..\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
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??
Qt 5.3 Opensource & Creator 3.1.2
I assume that append creates a copy of the appened object, as well as functions like value
Bookmarks