Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. QML and Qt Quick
  4. [SOLVED] How to add item to ListView?
Forum Updated to NodeBB v4.3 + New Features

[SOLVED] How to add item to ListView?

Scheduled Pinned Locked Moved QML and Qt Quick
18 Posts 4 Posters 43.7k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • G Offline
    G Offline
    goetz
    wrote on last edited by
    #4

    just call

    @
    QStandardItemModel *stdModel = new QStandardItemModel(this);

    // populate the model here, if you want

    listView->setModel(stdModel);
    @

    QStandardItemModel is a subclass of QAbstractItemModel, so you can use it for every item view (not for the item widgets, those do not need a model!). The [[Doc:QStandardItemModel]] has a basic usage example too.

    If you want to add new entries to the model, just call the respective methods of QStandardItemModel, like appendRow, insertRow, etc.

    http://www.catb.org/~esr/faqs/smart-questions.html

    1 Reply Last reply
    0
    • R Offline
      R Offline
      RazrFalcon
      wrote on last edited by
      #5

      No, no, no!
      I mean QML ListView! :)

      1 Reply Last reply
      0
      • G Offline
        G Offline
        goetz
        wrote on last edited by
        #6

        OMG - I completely missed that this is in the Qt Quick forums. I should have more coffee before posting weird stuff :-) - sorry for the confusion :)

        http://www.catb.org/~esr/faqs/smart-questions.html

        1 Reply Last reply
        0
        • R Offline
          R Offline
          RazrFalcon
          wrote on last edited by
          #7

          Never mind :)

          1 Reply Last reply
          0
          • R Offline
            R Offline
            RazrFalcon
            wrote on last edited by
            #8

            Any ideas how to add items?

            1 Reply Last reply
            0
            • G Offline
              G Offline
              goetz
              wrote on last edited by
              #9

              [quote author="RazrFalcon" date="1320507752"]Any ideas how to add items?[/quote]

              Sorry, I don't have much experience with Qt Quick/QML so far - but I'm pretty sure someone else is able to help you.

              http://www.catb.org/~esr/faqs/smart-questions.html

              1 Reply Last reply
              0
              • M Offline
                M Offline
                MichK
                wrote on last edited by
                #10

                You can always use insert, append, clear methods of "QML ListModel Element":http://doc.qt.nokia.com/4.7-snapshot/qml-listmodel.html.

                1 Reply Last reply
                0
                • R Offline
                  R Offline
                  RazrFalcon
                  wrote on last edited by
                  #11

                  I know, but I need to get items from QAbstractItemModel or other type of model.

                  1 Reply Last reply
                  0
                  • M Offline
                    M Offline
                    MichK
                    wrote on last edited by
                    #12

                    Hmm, If you exposed your "QAbstractItemModel":developer.qt.nokia.com/doc/qt-4.7/qabstractitemmodel.html derived model to QML like this

                    @
                    QDeclarativeView* iView;
                    //...
                    //MyListModel derived from QAbstractItemModel
                    MyListModel* iListModel;

                    //...
                    iView->rootContext()->setContextProperty("listModel",iListModel);
                    @
                    and set it in qml list like this
                    @
                    ListView {
                    //...
                    model:listModel
                    //...
                    }
                    @
                    then every time you insert something to your model you have to call
                    @
                    beginInsertRows(QModelIndex(),startPos,endPos);
                    endInsertRows();
                    @

                    and your QML ListView will be updated

                    1 Reply Last reply
                    0
                    • R Offline
                      R Offline
                      RazrFalcon
                      wrote on last edited by
                      #13

                      Ok. I set my model to ListView. Thanks.
                      But how to add new item to this model, for example, after click on MouseArea.
                      Something like:
                      @MouseArea {
                      onClicked: myModel.append("text") // but here I get an error "TypeError: Result of expression 'myModel.append' [undefined] is not a function."
                      }@

                      1 Reply Last reply
                      0
                      • A Offline
                        A Offline
                        andre
                        wrote on last edited by
                        #14

                        You will have to supply slots on your model (or another class that you have also exposed to QML) that provide this functionality. However, because you are using a QAbstractItemModel, we have no idea what kind of model that is, so it is impossible to help you with the details. Are you sure you need to have your model in C++ though? I mean, if you just want to append simple texts, why not use one of the models QML supplies you?

                        1 Reply Last reply
                        0
                        • M Offline
                          M Offline
                          MichK
                          wrote on last edited by
                          #15

                          Why not to use QML ListModel?

                          If you really want to do it using model exposed to QML from C++, then as Andre said you have to:
                          Make method which you call in onClicked a slot
                          @

                          public slot:
                          void append(/??/);
                          @
                          or declare method as invokable
                          @
                          Q_INVOKABLE void append(/??/);
                          @

                          1 Reply Last reply
                          0
                          • R Offline
                            R Offline
                            RazrFalcon
                            wrote on last edited by
                            #16

                            Thanks. It's works.

                            bq. Why not to use QML ListModel?

                            Becouse I need to use list items in my C++ code.
                            So QML - only GUI, all other works in C++ code. QML only for showing my items.
                            I think it's correct way, is it?

                            1 Reply Last reply
                            0
                            • A Offline
                              A Offline
                              andre
                              wrote on last edited by
                              #17

                              In principle, it is, yes. However, best practices are still materializing as Qt Quick is still a young technology. However, this approach: only GUI in Quick, the logic in C++ has been used successfully for real, commercial projects. There was a great presentation on this on the DevDays.

                              If you need access to your data from the C++ side, then it makes perfect sense to use a QAbstractItemModel to expose your data to the QML side of things. Could you please tell us your final solution, so others may learn from it?

                              1 Reply Last reply
                              0
                              • R Offline
                                R Offline
                                RazrFalcon
                                wrote on last edited by
                                #18

                                I understand. Thanks for explanation.

                                Here is my code example (all pretty simple):
                                app.qml
                                @import QtQuick 1.0

                                Item {
                                id: item
                                width: 300; height: 400

                                property int i: 0
                                
                                Component {
                                    id: myDelegate
                                    Row {
                                        spacing: 10
                                        Text { text: name }
                                        }
                                    }
                                
                                ListView {
                                    x: 0
                                    y: 0
                                    width: 300
                                    height: 350
                                    model: myModel
                                    delegate: myDelegate
                                }
                                
                                aRectangle {
                                    id: rectangle1
                                    x: 0
                                    y: 350
                                    width: 300
                                    height: 50
                                    color: "#000000"
                                
                                    MouseArea {
                                        anchors.fill: parent
                                        onClicked: myModel.append(i++)
                                    }
                                }
                                

                                }@

                                main.cpp
                                @#include <QDeclarativeView>
                                #include <QDeclarativeContext>
                                #include <QApplication>
                                #include "mymodel.h"

                                int main(int argc, char *argv[])
                                {
                                QApplication app(argc, argv);

                                QDeclarativeView view;
                                QDeclarativeContext *ctxt = view.rootContext();
                                ctxt->setContextProperty("myModel", new MyModel);
                                
                                view.setSource(QUrl::fromLocalFile&#40;"app.qml"&#41;&#41;;
                                view.show();
                                return app.exec&#40;&#41;;
                                

                                }@
                                mymodel.cpp
                                @#include "mymodel.h"

                                MyModel::MyModel(QObject *parent)
                                : QAbstractListModel(parent)
                                {
                                QHash<int, QByteArray> roles;
                                roles[NameRole] = "name";
                                setRoleNames(roles);
                                }

                                void MyModel::append(const QString &text)
                                {
                                beginInsertRows(QModelIndex(), rowCount(), rowCount());
                                itemList.append(text);
                                endInsertRows();
                                }

                                int MyModel::rowCount(const QModelIndex & parent) const
                                {
                                return itemList.count();
                                }

                                QVariant MyModel::data(const QModelIndex & index, int role) const
                                {
                                if (index.row() < 0 || index.row() > itemList.count())
                                return QVariant();
                                return itemList.at(index.row());
                                }@
                                mymodel.h
                                @#ifndef MYMODEL_H
                                #define MYMODEL_H

                                #include <QDeclarativeItem>
                                #include <QAbstractListModel>
                                #include <QStringList>

                                class MyModel : public QAbstractListModel
                                {
                                Q_OBJECT

                                public:
                                MyModel(QObject *parent = 0);

                                enum AnimalRoles {NameRole = Qt::UserRole + 1};
                                
                                void addItem(const QString &text);
                                int rowCount(const QModelIndex & parent = QModelIndex()) const;
                                QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;
                                

                                public slots:
                                void append(const QString &text);

                                private:
                                QStringList itemList;
                                };
                                #endif@

                                1 Reply Last reply
                                0

                                • Login

                                • Login or register to search.
                                • First post
                                  Last post
                                0
                                • Categories
                                • Recent
                                • Tags
                                • Popular
                                • Users
                                • Groups
                                • Search
                                • Get Qt Extensions
                                • Unsolved