m
mihamuz10 января 2019 г. 15:00

QML C++

ListView, height

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

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

23
m
  • 10 января 2019 г. 15:11

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

    Алексей Внуков
    • 10 января 2019 г. 16:43
    • (ред.)

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

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

      Evgenii Legotckoi
      • 11 января 2019 г. 1:51

      Добрый день!

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

        m
        • 11 января 2019 г. 9:58

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

          m
          • 11 января 2019 г. 10:54

          Полосу прокрутки добовляю с помощью 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 должена знать либо общее количество объектов жевущий в модели либо должен уметь при прокрутке их подгружать из модели.

            Алексей Внуков
            • 11 января 2019 г. 11:07
            • (ред.)

            сделайте отдельно область, и в эту область всуньте список.
            пример из проекта, список заполняется из 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
              • 11 января 2019 г. 11:10

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

                Алексей Внуков
                • 11 января 2019 г. 11:15

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

                  m
                  • 11 января 2019 г. 15:06

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

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

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

                    m
                    • 11 января 2019 г. 15:11
                    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 элементов.

                      Алексей Внуков
                      • 11 января 2019 г. 15:15

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

                        m
                        • 11 января 2019 г. 15:27

                        .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);
                        
                          Алексей Внуков
                          • 11 января 2019 г. 16:10

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

                          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
                            • 11 января 2019 г. 16:19

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

                              m
                              • 11 января 2019 г. 16:22

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

                                m
                                • 11 января 2019 г. 16:27

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

                                  m
                                  • 11 января 2019 г. 16:34

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

                                    Алексей Внуков
                                    • 11 января 2019 г. 16:39
                                    • (ред.)

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

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

                                    EventSqlModel::EventSqlModel(QObject *parent): QSqlQueryModel(parent)
                                    {
                                        this->updateModel();
                                    }
                                    
                                    void SqlQueryModel::updateModel()
                                    {
                                        QSqlQueryModel::setQuery(query);
                                        generateRoleNames();
                                    }
                                    
                                      m
                                      • 11 января 2019 г. 16:47

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

                                        m
                                        • 11 января 2019 г. 16:52

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

                                          m
                                          • 11 января 2019 г. 16:53

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

                                            Алексей Внуков
                                            • 11 января 2019 г. 17:08

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

                                              m
                                              • 13 января 2019 г. 11:52
                                              • Ответ был помечен как решение.

                                              И так может кому будет интересно решил свою проблему следующим путем.
                                              Через дизайнер в базовый виджет добавил 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);
                                              

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

                                                Комментарии

                                                Только авторизованные пользователи могут публиковать комментарии.
                                                Пожалуйста, авторизуйтесь или зарегистрируйтесь
                                                AD

                                                C++ - Тест 004. Указатели, Массивы и Циклы

                                                • Результат:50баллов,
                                                • Очки рейтинга-4
                                                m
                                                • molni99
                                                • 26 октября 2024 г. 8:37

                                                C++ - Тест 004. Указатели, Массивы и Циклы

                                                • Результат:80баллов,
                                                • Очки рейтинга4
                                                m
                                                • molni99
                                                • 26 октября 2024 г. 8:29

                                                C++ - Тест 004. Указатели, Массивы и Циклы

                                                • Результат:20баллов,
                                                • Очки рейтинга-10
                                                Последние комментарии
                                                i
                                                innorwall15 ноября 2024 г. 10:27
                                                Релиз утилиты развертывания С++/Qt и QML приложений 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
                                                innorwall15 ноября 2024 г. 5:26
                                                Qt/C++ - Урок 031. QCustomPlot - строим график по времени buy generic priligy We can just chat, and we will not lose too much time anyway
                                                i
                                                innorwall15 ноября 2024 г. 3:03
                                                Qt/C++ - Урок 060. Настройка внешнего вида приложения в рантайме I didnt have an issue work colors priligy dapoxetine 60mg revia cost uk August 3, 2022 Reply
                                                i
                                                innorwall14 ноября 2024 г. 19:42
                                                Как Копировать Файлы в Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
                                                Сейчас обсуждают на форуме
                                                i
                                                innorwall14 ноября 2024 г. 11:39
                                                добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
                                                i
                                                innorwall11 ноября 2024 г. 18:55
                                                Всё ещё разбираюсь с кешем. 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
                                                9Anonim25 октября 2024 г. 16:10
                                                Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
                                                ИМ
                                                Игорь Максимов3 октября 2024 г. 11:05
                                                Реализация навигации по разделам Спасибо Евгений!

                                                Следите за нами в социальных сетях