m
mihamuzJan. 10, 2019, 3 p.m.

QML C++

ListView, height

Добрый вечер.
Написал свою модель на основе QAbstractListModel как тут .
Все заработало но у меня элементов больше чем в примере. Соответственно не все помещаются в область ограниченную высотой height:200. При прокрутке списка оставшиеся элементы вне поля видимости не подгружаются.При увелечении height элементов становится больше.
Вопрос.
Как правильно задать параметр height?

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

23
m
  • Jan. 10, 2019, 3:11 p.m.

Забыл добавить.
Все это дела поместил в заранее сформированный QWidget с помощью QQuickWidget а не QQuickView как в примере

    Алексей Внуков
    • Jan. 10, 2019, 4:43 p.m.
    • (edited)

    Попробуйте сначало создать квадрат нужных размеров, а потом поместить список и задать параметр заполнить родителя.

    п.с. У вас таки интерфейс на виджетах или qml?

      Evgenii Legotckoi
      • Jan. 11, 2019, 1:51 a.m.

      Добрый день!

      Думаю, что здесь ещё нужно поместить всё в ScrollArea, чтобы были полосы прокрутки.

        m
        • Jan. 11, 2019, 9:58 a.m.

        Добрый вечер. Постепенно перевожу с виджета на QML

          m
          • Jan. 11, 2019, 10:54 a.m.

          Полосу прокрутки добовляю с помощью ScrollBar.vertical: ScrollBar {} она то появляется. Вопрос то в другом.
          Вот например

              ListView {
                  width: 160
                  height: 240
          
                  model: 100
          
                  delegate: ItemDelegate {
                      text: modelData
                      width: parent.width
          
                  }
          
                  ScrollIndicator.vertical: ScrollIndicator { }
              }
          

          Элементы не попавшие в область появляются при прокрутке скрола.
          У меня же количества объектов на прямую зависит от высоты ListView.
          Выстовляю например height:100 подгружается 10 наименований и далее пустота. или 200 тогда 25 наименований
          Как я понимаю ListView должена знать либо общее количество объектов жевущий в модели либо должен уметь при прокрутке их подгружать из модели.

            Алексей Внуков
            • Jan. 11, 2019, 11:07 a.m.
            • (edited)

            сделайте отдельно область, и в эту область всуньте список.
            пример из проекта, список заполняется из QSqlQueryModel, количество элемнтов может быть разное, каждый элемент списка представляется чекбоксом

                Rectangle
                        {
                            id: events_arch
                            anchors.top: top_rect_arch.top
                            anchors.bottom: top_rect_arch.bottom
                            anchors.left: select_arch.right
                            anchors.right: parent.right
                            anchors.margins: 5
                            color: style.secondMainColor
            
                            ListView {
                                id: tableView
                                anchors.fill: parent
                                anchors.margins: 5
                                model: eventModel
            
                                highlight: highlight
                                delegate: CheckBox
                                {
                                    id: ch_m
                                    text: N+" "+ " "+ENG_TEXT
                                    indicator: Rectangle
                                    {
                                        anchors.verticalCenter: parent.verticalCenter
                                        implicitHeight:16
                                        implicitWidth:16
                                        radius: 3
                                        color:style.textColor
                                        border.color: style.mainBorderColor
                                        border.width: 1
            
                                        Rectangle {
                                            visible: checked
                                            color: style.greenColor
                                            border.color: "#333"
                                            radius: 1
                                            anchors.margins: 4
                                            anchors.fill: parent
                                        }
                                    }
                                    contentItem: Text
                                    {
                                        leftPadding: ch_m.indicator.width + 4
                                        color: "#d0d0d0"
                                        text:ch_m.text
                                        horizontalAlignment: Text.AlignLeft
                                        verticalAlignment: Text.AlignVCenter
                                    }
                                    onCheckedChanged:
                                    {
                                        n_event+=N+','
                                    }
                                }
                            }
                        }
            
            

            список берет все что есть в моделе

              Evgenii Legotckoi
              • Jan. 11, 2019, 11:10 a.m.

              Добавлю только, что может ещё понадобиться использовать clip: true в Rectangle или ListView, а то могут элементы вылезать за границы парента

                Алексей Внуков
                • Jan. 11, 2019, 11:15 a.m.

                благодарю, учту

                  m
                  • Jan. 11, 2019, 3:06 p.m.

                  Все равно не пойму. Если статически набиваю все работает

                  ListModel {
                          id:productListModel1
                          ListElement {
                  
                          }
                          ListElement {
                  
                          }
                          ListElement {
                  
                          }
                          ListElement {
                  
                          }
                          ListElement {
                  
                          }
                          ListElement {
                  
                          }
                  
                      }
                  

                  Если динамически то показывает один элемент. Хотя отладчик говорит что в модели живет 10.

                    m
                    • Jan. 11, 2019, 3:11 p.m.
                    Rectangle {
                        id: mainTabLayout
                        clip: true
                        ListView {
                            id: view
                            anchors.fill: parent
                             cacheBuffer: 100 * 10
                             anchors.margins: 10
                             spacing: 10
                             model: productListModel
                            delegate: Rectangle {
                                id: delegateproduct
                                width: view.width
                                height: 50
                                color: "orange"   
                            }
                          ScrollBar.vertical: ScrollBar {}
                        }
                    
                    }
                    

                    Выстовляю значение mainTabLayout напримет height: 300 отображаются уже 5 элементов.

                      Алексей Внуков
                      • Jan. 11, 2019, 3:15 p.m.

                      от куда берете данные?

                        m
                        • Jan. 11, 2019, 3:27 p.m.

                        .h

                        #include <QAbstractListModel>
                        #include <QJsonObject>
                        
                        class ProductListItem
                        {
                        public:
                            ProductListItem(const QString &imgresurs, const QString &article,const QString &name_article);
                        
                            QString imgresurs() const;
                            QString article() const;
                            QString name_article() const;
                        
                        private:
                            QString m_imgresurs;
                            QString m_article;
                            QString m_name_article;
                        };
                        
                        
                        class ProductListModel : public QAbstractListModel
                        {
                            Q_OBJECT
                        
                        public:
                            explicit ProductListModel(QObject *parent = nullptr);
                        
                            enum Roles{
                                NameArticleRole = Qt::UserRole+1,
                                ArticleRole,ImgResursRole,PriseRole
                            };
                        
                            // Basic functionality:
                            virtual int rowCount(const QModelIndex &parent = QModelIndex()) const override;
                        
                            virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
                        
                            // Editable:
                            virtual bool setData(const QModelIndex &index, const QVariant &value,int role = Qt::EditRole)  override;
                        
                           void addItem(const ProductListItem &item);
                        
                        
                        protected:
                        
                            virtual QHash<int, QByteArray> roleNames() const override;
                        
                        private:
                        
                            QList<ProductListItem> m_data;
                        
                        };
                        

                        .cpp

                        ProductListItem::ProductListItem(const QString &imgresurs, const QString &article,const QString &name_article)
                            : m_imgresurs(imgresurs), m_article(article), m_name_article(name_article)
                        {
                        }
                        
                        QString ProductListItem::imgresurs() const
                        {
                            return m_imgresurs;
                        }
                        
                        QString ProductListItem::article() const
                        {
                            return m_article;
                        }
                        
                        QString ProductListItem::name_article() const
                        {
                            return m_name_article;
                        }
                        
                        
                        
                        
                        ProductListModel::ProductListModel(QObject *parent)
                            : QAbstractListModel(parent)
                        {
                        }
                        
                        int ProductListModel::rowCount(const QModelIndex &parent) const
                        {
                            // For list models only the root node (an invalid parent) should return the list's size. For all
                            // other (valid) parents, rowCount() should return 0 so that it does not become a tree model.
                            Q_UNUSED(parent);
                               return this->m_data.count();
                        
                        }
                        
                        QVariant ProductListModel::data(const QModelIndex &index, int role) const
                        {
                        
                        
                             const ProductListItem item = this->m_data.at(index.row());
                        
                            switch (role) {
                              case ArticleRole:
                                  return QVariant(item.article());
                              case ImgResursRole:
                                return QVariant("item.imgresurs());
                              case  NameArticleRole:
                                return QVariant(item.name_article());
                              default:
                                  return QVariant();
                              }
                        
                        }
                        
                        bool ProductListModel::setData(const QModelIndex &index, const QVariant &value, int role)
                        {
                        
                        
                            return false;
                        }
                        
                        void ProductListModel::addItem(const ProductListItem &item)
                        {
                        
                            beginInsertRows(QModelIndex(), rowCount(), rowCount());
                                m_data << item;
                                endInsertRows();
                        }
                        
                        QHash<int, QByteArray> ProductListModel::roleNames() const
                        {
                            QHash<int, QByteArray> roles = QAbstractListModel::roleNames();
                               roles[NameArticleRole] = "name_article";
                               roles[ArticleRole] = "article";
                               roles[ImgResursRole] = "imgresurs";
                               return roles;
                        }
                        

                        тут собственно вызываю

                           ProductListModel model;
                           // Наполняем модель
                           for(int i = 0; i<array->count();i++){
                               QJsonObject obj = array->at(i).toObject();
                               model.addItem(ProductListItem(obj["img"].toString(),
                                                             obj["article"].toString(),
                                                             obj["name_article"].toString()));
                           }
                        
                            this->m_quickWidget = new QQuickWidget(this) ;
                            this->m_quickWidget->engine()->rootContext()->setContextProperty("productListModel",&model);
                            this->m_quickWidget->setSource(QUrl("qrc:/Category.qml"));
                            this->m_quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView);
                            ui->gridLayout_2->addWidget(this->m_quickWidget, 1, 0);
                        
                          Алексей Внуков
                          • Jan. 11, 2019, 4:10 p.m.

                          получается вы парсите некий жисоновский массив и хотите вывести с него данные, что хотите получить в результате в списке? и почему у вас в делегате просто оранжевые прямоугольники, почему сразу не пытаетесь вывести нужные данные? и что у вас приходит в жисоне?поскольку такой простенький вариант выводит список без проблем

                          import QtQuick 2.12
                          import QtQuick.Controls 1.4
                          import QtQuick.Controls 2.2
                          import QtQuick.Window 2.12
                          
                          Window {
                              visible: true
                              width: 640
                              height: 480
                              title: qsTr("Hello World")
                              Rectangle
                              {
                                  anchors.fill: parent
                          
                                  id: mainTabLayout
                                  clip: true
                                  ListView {
                                      id: view
                                      anchors.fill: parent
                                       cacheBuffer: 100 * 10
                                       anchors.margins: 10
                                       spacing: 10
                                       model:["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28"]
                                      delegate: Rectangle {
                                          id: delegateproduct
                                          width: view.width
                                          height: 50
                                          color: "orange"
                                      }
                                    ScrollBar.vertical: ScrollBar {}
                                  }
                              }
                          }
                          
                          

                          копайте в сторону вашей модели и проверьте данные которые приходят и которые находятся самой модели

                            m
                            • Jan. 11, 2019, 4:19 p.m.

                            "почему у вас в делегате просто оранжевые прямоугольники" упростил для показа код.

                              m
                              • Jan. 11, 2019, 4:22 p.m.

                              Не пойму что не так).

                                m
                                • Jan. 11, 2019, 4:27 p.m.

                                Проблема явно с моделью.

                                  m
                                  • Jan. 11, 2019, 4:34 p.m.

                                  Отрисовывается только первый элемент модели. Который показан в отладочной информации.

                                    Алексей Внуков
                                    • Jan. 11, 2019, 4:39 p.m.
                                    • (edited)

                                    а у вас модель заполняется в main.cpp? если да, попробуйте данную реализацию вынести в функцию класса создания модели, и вызывать наполнение модели в конструкторе класса.

                                    пример (конструктор модели из предыдущего кода)

                                    EventSqlModel::EventSqlModel(QObject *parent): QSqlQueryModel(parent)
                                    {
                                        this->updateModel();
                                    }
                                    
                                    void SqlQueryModel::updateModel()
                                    {
                                        QSqlQueryModel::setQuery(query);
                                        generateRoleNames();
                                    }
                                    
                                      m
                                      • Jan. 11, 2019, 4:47 p.m.

                                      Модель наполняется не в main. Наполнение производится по сигналу из дерева категорий

                                        m
                                        • Jan. 11, 2019, 4:52 p.m.

                                        Интересно что virtual QVariant data срабатывает только один раз хотя m_data>1

                                          m
                                          • Jan. 11, 2019, 4:53 p.m.

                                          Ладно не буду вас отвлекать повожусь сам. Спасибо)

                                            Алексей Внуков
                                            • Jan. 11, 2019, 5:08 p.m.

                                            мне уже и самому интересно.
                                            перенесите "setContextProperty("productListModel",&model)" в main.cpp
                                            простенький пример можно посмотреть тут а это помогло мне когда разбирался с моделями

                                              m
                                              • Jan. 13, 2019, 11:52 a.m.
                                              • The answer was marked as a solution.

                                              И так может кому будет интересно решил свою проблему следующим путем.
                                              Через дизайнер в базовый виджет добавил QQuickWidget (назвал его listProducts)
                                              Это соответственно убрал.

                                               this->m_quickWidget = new QQuickWidget(this) ;
                                                  this->m_quickWidget->engine()->rootContext()->setContextProperty("productListModel",&model);
                                                  this->m_quickWidget->setSource(QUrl("qrc:/Category.qml"));
                                                  this->m_quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView);
                                                  ui->gridLayout_2->addWidget(this->m_quickWidget, 1, 0);
                                              

                                              а вместо написал

                                              ui->listProducts->engine()->rootContext()->setContextProperty("productListModel",model);
                                                  ui->listProducts->setSource(QUrl("qrc:/Category.qml"));
                                                  ui->listProducts->setResizeMode(QQuickWidget::SizeRootObjectToView);
                                              

                                              и все заработало) Всем спасибо.

                                                Comments

                                                Only authorized users can post comments.
                                                Please, Log in or Sign up
                                                AD

                                                C ++ - Test 004. Pointers, Arrays and Loops

                                                • Result:50points,
                                                • Rating points-4
                                                m

                                                C ++ - Test 004. Pointers, Arrays and Loops

                                                • Result:80points,
                                                • Rating points4
                                                m

                                                C ++ - Test 004. Pointers, Arrays and Loops

                                                • Result:20points,
                                                • Rating points-10
                                                Last comments
                                                i
                                                innorwallNov. 15, 2024, 1:44 p.m.
                                                Qt/C++ - Lesson 039. How to paint stroke in QSqlTableModel by value in the column? Many OPKs would advise users to start using the test strips around day 9 of your cycle, considering day 1 to be the first day of full menstrual flow buy priligy australia
                                                i
                                                innorwallNov. 15, 2024, 10:27 a.m.
                                                Release of C++/Qt and QML application deployment utility CQtDeployer v1.4.0 (Binary Box) optionally substituted alkoxy, optionally substituted alkenyloxy, optionally substituted alkynyloxy, optionally substituted aryloxy, OCH, OC H, OC H, OC H, OC H, OC H, OC H, O C CH, OCH CH OH, O…
                                                i
                                                innorwallNov. 15, 2024, 5:26 a.m.
                                                Qt/C++ - Lesson 031. QCustomPlot – The build of charts with time buy generic priligy We can just chat, and we will not lose too much time anyway
                                                i
                                                innorwallNov. 15, 2024, 3:03 a.m.
                                                Qt/C++ - Lesson 060. Configuring the appearance of the application in runtime I didnt have an issue work colors priligy dapoxetine 60mg revia cost uk August 3, 2022 Reply
                                                i
                                                innorwallNov. 14, 2024, 8:07 p.m.
                                                Circuit switching and packet data transmission networks Angioedema 1 priligy dapoxetine
                                                Now discuss on the forum
                                                t
                                                tonypeachey1Nov. 15, 2024, 2:04 p.m.
                                                google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                                                i
                                                innorwallNov. 15, 2024, 1:50 p.m.
                                                добавить qlineseries в функции priligy for sale Gently flush using an ear syringe
                                                i
                                                innorwallNov. 11, 2024, 6:55 p.m.
                                                Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
                                                9
                                                9AnonimOct. 25, 2024, 4:10 p.m.
                                                Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                                                Follow us in social networks