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);
                                              

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

                                                Комментарии

                                                Только авторизованные пользователи могут публиковать комментарии.
                                                Пожалуйста, авторизуйтесь или зарегистрируйтесь
                                                г
                                                • ги
                                                • 24 апреля 2024 г. 1:51

                                                C++ - Тест 005. Структуры и Классы

                                                • Результат:41баллов,
                                                • Очки рейтинга-8
                                                l
                                                • laei
                                                • 23 апреля 2024 г. 19:19

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

                                                • Результат:10баллов,
                                                • Очки рейтинга-10
                                                l
                                                • laei
                                                • 23 апреля 2024 г. 19:17

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

                                                • Результат:50баллов,
                                                • Очки рейтинга-4
                                                Последние комментарии
                                                k
                                                kmssr9 февраля 2024 г. 5:43
                                                Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                                                АК
                                                Анатолий Кононенко5 февраля 2024 г. 12:50
                                                Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                                                EVA
                                                EVA25 декабря 2023 г. 21:30
                                                Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                                                J
                                                JonnyJo25 декабря 2023 г. 19:38
                                                Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
                                                G
                                                Gvozdik19 декабря 2023 г. 8:01
                                                Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
                                                Сейчас обсуждают на форуме
                                                G
                                                Gar22 апреля 2024 г. 15:46
                                                Clipboard Как скопировать окно целиком в clipb?
                                                DA
                                                Dr Gangil Academics20 апреля 2024 г. 17:45
                                                Unlock Your Aesthetic Potential: Explore MSC in Facial Aesthetics and Cosmetology in India Embark on a transformative journey with an msc in facial aesthetics and cosmetology in india . Delve into the intricate world of beauty and rejuvenation, guided by expert faculty and …
                                                a
                                                a_vlasov14 апреля 2024 г. 16:41
                                                Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
                                                Павел Дорофеев
                                                Павел Дорофеев14 апреля 2024 г. 12:35
                                                QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
                                                f
                                                fastrex4 апреля 2024 г. 14:47
                                                Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…

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