Проблема с излучением сигнала — Listview не показывает полный список

#c #listview #qml

#c #просмотр списка #qml

Вопрос:

Я привязываю ListView к значениям, переданным из cpp.

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

Проверено: я создал ListModel / ListElement в main.qml в качестве теста и привязки к ListView, теперь Listview работает нормально, отображает все значения

Я подозреваю, что после испускания сигнала возникает ошибка.

Фрагмент кода:

main.qml

 ListView {
    id: idListView
    anchors {
        left: parent.left
        leftMargin: 10 * scaleFactor
        right: parent.right
        rightMargin: 10 * scaleFactor
        top: rectangleToolBar.bottom
        topMargin: 10 * scaleFactor
        bottom: rectangleStatusBar.top
        bottomMargin: 10 * scaleFactor
    }
    // model: objHomeController.detailsModel // Display only one row
    //model: idListmodel //Working fine
    delegate: comsearchDelegate
    spacing: 10 * scaleFactor
    clip: true

    highlight: Rectangle {
        color: 'grey'
        Text {
            anchors.centerIn: parent
            color: 'white'
        }
    }
    focus: true
}


Component {
    id: comsearchDelegate
    Row {
        spacing: 10 * scaleFactor

        Column {
            Layout.alignment: Qt.AlignTop

            Text { text: title; font { pixelSize: 14 * scaleFactor; bold: true } }
            Text { text: description; font { pixelSize: 14 * scaleFactor; bold: true } }

        }
    }
}

ListModel {
    id: idListModel
    ListElement{
        title : "sdfsdf";
        description:"sdfsdfs";

    }
    ListElement {
        title : "sdfsdf";
        description:"sdfsdfs";
    }
    ListElement {
        title : "sdfsdf";
        description:"sdfsdfs";
    }
    ListElement {
        title : "sdfsdf";
        description:"sdfsdfs";
    }
}
 

HomeController.h

 Q_PROPERTY(Model* detailsModel READ get_detailsModel WRITE set_detailsModel NOTIFY detailsModelChanged )
 

HomeController.cpp

 void HomeController::set_detailsModel(Model* value)
{
    m_detailsModel = value;

    //value has correct values - checked.
    emit detailsModelChanged(value);
}

Model* HomeController::get_detailsModel(void)
{
    return m_detailsModel;
}

void HomeController::getAllData()
{
    m_detailsModel->clear();
    m_detailsModel->updateModel(eveReadXML());
    set_detailsModel(m_detailsModel);
}
 

Model.cpp

 void Model::updateModel(const QList<Details> amp; details)
{
    if(this->rowCount() > 0) {
        this->clear();
    }

    beginInsertRows(QModelIndex(),rowCount(),rowCount());
    m_modelData.append(details);
    endInsertRows();
}
 

Поскольку я пришел.Чистый фон, я хотел бы понять привязку Listview / GridView к DataTable или XML. Здесь я последовал, создал класс с именем Details [Details.h] и создал Model.h/Model.cpp и извлекать значение оттуда и привязывать к ListView. Я все делаю правильно, или у нас есть другой поток. Любой учебник / Codesnippet / Ссылка для проектов высоко ценится.

Комментарии:

1. Как вы пришли к выводу, что это имеет какое-либо отношение к сигналу? Насколько я могу судить по вашему описанию, он работает нормально, иначе представление было бы полностью пустым. Я предполагаю, что ваша модель работает некорректно. Вы действительно его тестировали?

2. Не могли бы вы показать нам get_detailsModel() определение?

3. Дорогой Ansh, я опубликовал приведенный выше код в виде потока.

4. Трудно найти, в чем проблема, из-за краткого кода. Рабочий код, сокращенный до минимума, будет полезен. Пожалуйста, опубликуйте рабочий код.

Ответ №1:

Чтобы определить ListModel из c , вам необходимо создать подкласс QAbstractListModel

https://doc.qt.io/qt-5/qabstractlistmodel.html

Вы можете взять пример с QQmlObjectListModel в этом проекте: http://gitlab.unique-conception.org/qt-qml-tricks/qt-qml-models

Или клонируйте его и используйте в своем проекте следующим образом :

 Q_PROPERTY(QQmlObjectListModel<Details>* detailsModel READ get_detailsModel WRITE set_detailsModel NOTIFY detailsModelChanged)