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
                                                ИМ
                                                Игорь МаксимовNov. 22, 2024, 11:51 a.m.
                                                Django - Tutorial 017. Customize the login page to Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                                                Evgenii Legotckoi
                                                Evgenii LegotckoiOct. 31, 2024, 2:37 p.m.
                                                Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                                                A
                                                ALO1ZEOct. 19, 2024, 8:19 a.m.
                                                Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                                                ИМ
                                                Игорь МаксимовOct. 5, 2024, 7:51 a.m.
                                                Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                                                d
                                                dblas5July 5, 2024, 11:02 a.m.
                                                QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                                                Now discuss on the forum
                                                Evgenii Legotckoi
                                                Evgenii LegotckoiJune 24, 2024, 3:11 p.m.
                                                добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                                                t
                                                tonypeachey1Nov. 15, 2024, 6:04 a.m.
                                                google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                                                NSProject
                                                NSProjectJune 4, 2022, 3:49 a.m.
                                                Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                                                9
                                                9AnonimOct. 25, 2024, 9:10 a.m.
                                                Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                                                Follow us in social networks