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
                                                e
                                                • ehot
                                                • April 1, 2024, 2:29 a.m.

                                                C++ - Тест 003. Условия и циклы

                                                • Result:78points,
                                                • Rating points2
                                                B

                                                C++ - Test 002. Constants

                                                • Result:16points,
                                                • Rating points-10
                                                B

                                                C++ - Test 001. The first program and data types

                                                • Result:46points,
                                                • Rating points-6
                                                Last comments
                                                k
                                                kmssrFeb. 9, 2024, 7:43 a.m.
                                                Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                                                Qt WinAPI - Lesson 007. Working with ICMP Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                                                EVA
                                                EVADec. 25, 2023, 11:30 p.m.
                                                Boost - static linking in CMake project under Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                                                J
                                                JonnyJoDec. 25, 2023, 9:38 p.m.
                                                Boost - static linking in CMake project under Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
                                                G
                                                GvozdikDec. 19, 2023, 10:01 a.m.
                                                Qt/C++ - Lesson 056. Connecting the Boost library in Qt for MinGW and MSVC compilers Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
                                                Now discuss on the forum
                                                a
                                                a_vlasovApril 14, 2024, 6:41 p.m.
                                                Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
                                                Павел Дорофеев
                                                Павел ДорофеевApril 14, 2024, 2:35 p.m.
                                                QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
                                                f
                                                fastrexApril 4, 2024, 4:47 p.m.
                                                Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…
                                                AC
                                                Alexandru CodreanuJan. 20, 2024, 12:57 a.m.
                                                QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…

                                                Follow us in social networks