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

Mark markg85 at gmail.com
Thu Nov 8 14:36:20 CET 2012


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?



More information about the Interest mailing list