m
Jan. 10, 2019, 8 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.
23
m

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

0

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

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

0

Добрый день!

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

0
m

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

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

0

сделайте отдельно область, и в эту область всуньте список. пример из проекта, список заполняется из 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+','
                        }
                    }
                }
            }

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

1

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

0

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

1
m

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

ListModel {
        id:productListModel1
        ListElement {

        }
        ListElement {

        }
        ListElement {

        }
        ListElement {

        }
        ListElement {

        }
        ListElement {

        }

    }

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

0
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 элементов.

0

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

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

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

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 {}
        }
    }
}

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

0
m

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

0
m

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

0
m

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

0
m

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

0

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

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

EventSqlModel::EventSqlModel(QObject *parent): QSqlQueryModel(parent)
{
    this->updateModel();
}

void SqlQueryModel::updateModel()
{
    QSqlQueryModel::setQuery(query);
    generateRoleNames();
}
0
m

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

0
m

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

0
m

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

0

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

1
m
  • Jan. 13, 2019, 4:52 p.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);

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

2

Comments

Only authorized users can post comments.
Please, Log in or Sign up
TT
June 13, 2019, 7:01 p.m.
Taimoor Tanweer

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

  • Result:66points,
  • Rating points-1
TT
June 13, 2019, 6:51 p.m.
Taimoor Tanweer

C++ - Test 002. Constants

  • Result:75points,
  • Rating points2
ВМ
June 13, 2019, 12:30 p.m.
Ваня Мороз

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

  • Result:100points,
  • Rating points10
Last comments
МБ
June 20, 2019, 6:23 p.m.
Михаил Булатов

А если мне нужно сделать конект из дочернего qml?Сигнал работает только из main.qml
i
June 17, 2019, 6:10 a.m.
ingenfly

Только по осям xAxis2, уAxis2 значения начинаются с 0. Почему-то xAxis2 и xAxis не синхронизированы по данным. Ну и QCustomPlot последний.
June 16, 2019, 8:21 p.m.
Евгений Легоцкой

Добрый день. Ну точно также добавляете ту же самую информацию на ось xAxis2, только добавляете другое форматирование customPlot->xAxis2->setDateTimeFormat("hh:mm"); если я ...
EF
June 14, 2019, 1:56 p.m.
Egor Fomin

Спасибо за ваш ответ, у меня получилось реализовать это. Тем не менее появилась другая проблема, поэтому опять надеюсь на вашу помощь. Скажем, я уже выставил точки и они соеденены. Когда я нач...
d
June 13, 2019, 2:47 p.m.
damix

Можно классу, который описывает точку, добавить сигнал, который подавать (emit), когда точка перемещается (переопределить mouseMoveEvent или mouseReleaseEvent). Так вот эти сигналы у каждой из...
Now discuss on the forum
June 20, 2019, 9:30 a.m.
IscanderChe

Вернулся к этой задачке только-только, поэтому и не ответил ничего раньше.Как переопределить mouseReleaseEvent(QMouseEvent* event) у QTableView, если QTableView задан в ui? Или задавать QTabl...
I
June 19, 2019, 1:41 p.m.
Intruder

Всем добрый день. При разборе XML файла наткнулся на тег вот такого плана: <TagName attribute1="value1" attribute2="value2" /> При попытке проверить на наличие такого элеме...
June 19, 2019, 12:55 p.m.
Михаиллл

Скажите пожалуйста, как его в таком случае перемещать и удалять?
June 18, 2019, 7:50 p.m.
Дмитрий

Большое спасибо! SDK заработал.К сожалению удалось продвинутся только на один шаг. При сборке чистого проекта NDK выдаёт следующие ошибки C:\Android\ndk-bundle/toolchains/arm-linux-andr...
June 18, 2019, 4:59 p.m.
Михаиллл

Добрый день.В этом учебнике представлен код INSTALLED_APPS = ( ... 'rest_framework', 'snippets.apps.SnippetsConfig',) На строчке 'snippets.apps.SnippetsConf...
Looking for a Job?
25,000.00 руб. - 30,000.00 руб.
Разработчик Qt/C++
Barnaul, Altai Krai, Russia

For registered users on the site there is a minimum amount of advertising

EVILEG
About
Services
Join us
© EVILEG 2015-2019
Recommend hosting TIMEWEB