Privacy policyContactsAbout siteOpinionsGitHubDonate
© EVILEG 2015-2018
Recommend hosting
TIMEWEB
m
Jan. 10, 2019, 8 p.m.

QML C++

ListView, height

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

Virtual hosting with 10 percent discount
Virtual hosting with 10 percent discount
EVILEG offers reliable hosting with a 10% discount for virtual hosting and 5% for VPS
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
D
March 19, 2019, 9:57 a.m.
Damir

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

  • Result:73points,
  • Rating points1
ПМ
March 18, 2019, 3:12 p.m.
Пётр Махнёв

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:50points,
  • Rating points-4
ЯГ
March 18, 2019, 7:59 a.m.
Ян Греку

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

  • Result:21points,
  • Rating points-10
Last comments
March 16, 2019, 1:55 p.m.
Дмитрий

Спасибо за статью. Давно итересует следующий вопрос: с помощью переменных QMAKE_TARGET_COMPANYQMAKE_TARGET_PRODUCTQMAKE_TARGET_DESCRIPTIONможно задать свойства компилируемой программы, о...
JS
March 12, 2019, 10:19 a.m.
Jean Stefanovich

Большое спасибо за разъяснения!
March 12, 2019, 10:04 a.m.
Евгений Легоцкой

Hello, In fact, this functionality or is not implemented, or is not documented. I'm not sure. But I think, that it should be implemented in Text QML Type. Because of we can write text in...
March 12, 2019, 9:51 a.m.
Евгений Легоцкой

Да вы правы. На самом деле проще через QSqlQueryModel, сколько не пытался использовать эти дженерики типо QSqlTableModel и QSqlRelationalTableModel, то всегда упирался в какие-то их ограничени...
JS
March 12, 2019, 9:47 a.m.
Jean Stefanovich

Единицы измерения лежат там же где и названия продуктов. Просто в таблице ингредиенты нет ещё одного столбца, на который можно было бы установить setRelation. Я в итоге в базе создал ещё один ...
Now discuss on the forum
March 17, 2019, 10:47 p.m.
Евгений Легоцкой

Добрый день. Вот, нашлось у меня немного времени. Делается это через шаблон проектирования наблюдатель. GraphKS_mfvSlup.zip
ЧГ
March 15, 2019, 9:52 p.m.
Чарльз Грин

спасибо, попробую, отпишусь
m
March 15, 2019, 7:41 p.m.
mihamuz

Сори догадался)
n
March 12, 2019, 4:57 p.m.
newbie.works.with.QT

Большооооое спасибо!!!!!Не передать как я вам благодарен, спасибо что всегда отзываетесь.Теперь я смогу продолжить работу в QT!!! (пробую писать бота (Я как вы могли догадаться немного не пр...
March 12, 2019, 1:20 p.m.
BlinCT

Ну так если у вас есть готовая программа так ей и воспользуйтесь. Вы же написали ее вот и пользуйтесь.
Join us in social networks

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