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