[Interest] Updating a model re-add everything in QML. How can i prevent that?

Mark markg85 at gmail.com
Thu Nov 8 19:09:31 CET 2012


On Thu, Nov 8, 2012 at 6:43 PM, Nicolás Ulrich <nikolaseu at gmail.com> wrote:
> Are you really using this?
> qRegisterMetaType<PathModel*>("PathModel*");            (with the * in
> the string)
>
> I guess it should be
> qRegisterMetaType<PathModel*>("PathModel");
>
>
>
> On Thu, Nov 8, 2012 at 10:36 AM, Mark <markg85 at gmail.com> wrote:
>> On Thu, Nov 8, 2012 at 10:34 AM, Bo Thorsen <bo at fioniasoftware.dk> wrote:
>>> Den 08-11-2012 01:33, Mark skrev:
>>>> Hi,
>>>>
>>>> I have a models in C++ (a QStringList actually). In QML i'm displaying
>>>> it using a repeater. Now when i remove some items from the end of the
>>>> list (which happens quite a few times) then the entire list seems to
>>>> go through the QML repeater again.
>>>>
>>>> What i want to do is put a QStringList in a QML Repeater (works), but
>>>> when i remove items from the end i would like QML to be "smart" and
>>>> also remove the items from the end and leave those that haven't
>>>> changed. Thus not re-inserting all the items in the repeater when not
>>>> needed.
>>>>
>>>> Is there some option to get that?
>>>
>>> To do this you need a better model than a QStringList in Repeater. Take
>>> a look at QStringListModel instead. But if you just call setStringList()
>>> you won't see any improvement. You have to use insertRows and removeRows
>>> instead.
>>>
>>> Bo Thorsen.
>>>
>>> Come by my DevDays talk in Berlin - "Designing for testability". Learn how to build and run your unit tests with the Qt application.
>>>
>>> Fionia Software - Qt experts for hire.
>>>
>>> _______________________________________________
>>> Interest mailing list
>>> Interest at qt-project.org
>>> http://lists.qt-project.org/mailman/listinfo/interest
>>
>> Thanks a lot for that, that will probably work.
>> However, i'm hitting another issue when trying to make a custom
>> StringListModel (only due to setRoleNames...) This is how it looks:
>>
>> // pathmodel.h
>> #ifndef PATHMODEL_H
>> #define PATHMODEL_H
>>
>> #include <QStringListModel>
>>
>> class PathModel : public QStringListModel
>> {
>> public:
>>     PathModel();
>> };
>>
>> Q_DECLARE_METATYPE(PathModel*)
>>
>> #endif // PATHMODEL_H
>>
>>
>> // pathmodel.cpp
>> #include "pathmodel.h"
>>
>> PathModel::PathModel()
>> {
>>     QHash<int,QByteArray> roleNames;
>>     roleNames.insert(Qt::DisplayRole, "modelData");
>>     setRoleNames(roleNames);
>> }
>>
>> Now if i want to register the new meta type using:
>> qRegisterMetaType<PathModel*>("PathModel*");
>>
>> The app instantly crashes when i run it.. It must be something very
>> obvious that i'm missing, but i don't see it.
>>
>> Any idea what i'm doing wrong?
>> _______________________________________________
>> Interest mailing list
>> Interest at qt-project.org
>> http://lists.qt-project.org/mailman/listinfo/interest

Yes.

But even if i change it to your suggestion it doesn't work. It's all
in the private copy ctor...



More information about the Interest mailing list