решено: я сделал все, как ответ eyllanesc и в моем FirstPage.qml внутри
делегировать, где я получаю доступ к данным модели, я ставлю модель данных перед именами.
Ранее внутри делегата FirstPage.qml я использовал: имя, завершено и
незавершенный и теперь я использую modelData.name, modelData.completed и
modelData.uncompleted. Теперь все хорошо.
Я полностью новичок в QT / QML, и я попытался, но не смог найти ответ на мою проблему.
Я использую модель (созданную в C ++) в QML. Когда приложение запускается, все в порядке, но когда я пытаюсь добавить новый элемент в модель, он не отображается в QML. Модель такая же, как с самого начала.
У меня есть класс modcontroller и внутри него я создаю список.
modcontroller.h
#ifndef MODCONTROLLER_H
#define MODCONTROLLER_H
#include <QObject>
#include <list.h>
class modcontroller : public QObject
{
Q_OBJECT
public:
explicit modcontroller(QObject *parent = nullptr);
QList<QObject*> getList();
Q_INVOKABLE void addList(QString nam);
signals:
void listChanged();
public slots:
private:
QList<QObject*> m_dataList;
};
#endif // MODCONTROLLER_H
modcontroller.cpp
#include "modcontroller.h"
#include <QDebug>
modcontroller::modcontroller(QObject *parent) : QObject(parent)
{
m_dataList.append(new List("Test"));
}
QList<QObject *> modcontroller::getList()
{
return m_dataList;
}
void modcontroller::addList(QString nam)
{
m_dataList.append(new List(nam));
qDebug() << "Function addList called";
qDebug() << m_dataList;
}
main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "list.h"
#include "modcontroller.h"
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
modcontroller controller;
engine.rootContext()->setContextProperty("myModel", QVariant::fromValue(controller.getList()));
engine.rootContext()->setContextProperty("controller",&controller);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
}
В файле QML у меня есть ListView с model: myModel
и кнопка с
onClicked: {
controller.addList(textInput.text)
myStackView.push(firstPage)
}
Когда я нажимаю «Создать», я вижу только первый элемент «Тест», который создается в начале, но в консоли я получаю это:
Function addList called
(List(0x2b7e60bc2c0), List(0x2b82d5891b0))
Заранее спасибо.
main.qml
ApplicationWindow {
visible: true
width: 580
height: 360
title: qsTr("Hello World")
StackView{
id: myStackView
initialItem: firstPage
anchors.fill: parent
}
Component{
id: firstPage
FirstPage{}
}
Component{
id: createNewListPage
CreateNewListPage{}
}
}
FirstPage.qml
Item {
ListView{
id: lists
width: 150
height: childrenRect.height
x: 15
y: 70
model: myModel
delegate: Row{
width: 150
height: 25
spacing: 5
Rectangle{
width: {
if(uncompleted < 3){return 3;}
else if(uncompleted < 6){return 6;}
else {return 10;}
}
height: {
if(uncompleted < 3){return 3;}
else if(uncompleted < 6){return 6;}
else {return 10;}
}
radius: 10
color: "#494949"
anchors.verticalCenter: parent.verticalCenter
}
Button {
id:button1
height: 23
contentItem: Text {
id: textTask
text: name
font.underline: true
color: "blue"
font.bold: true
font.pointSize: 10
height: 20
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
}
background: Rectangle {
id: rectangle
color: "transparent"
}
states:[
State {
name: "Hovering"
PropertyChanges {
target: textTask
color: "white"
font.bold: true
font.underline: false
}
PropertyChanges {
target: rectangle
color: "blue"
}
}]
MouseArea{
hoverEnabled: true
anchors.fill: button1
onEntered: { button1.state='Hovering'}
onExited: { button1.state=''}
}
}
Text{
font.pointSize: 8
text: {
if(uncompleted == 0)return "";
return "- " + uncompleted + " left";
}
color: "#494949"
anchors.verticalCenter: parent.verticalCenter
}
}
}
}
CreateNewListPage.qml
Item {
Rectangle{
width: 580
height: 360
Rectangle{
width: 350
height: 30
y: 100
x: 30
border.color: "#7b9cd3"
border.width: 1
TextInput {
id: textInput
anchors.topMargin: 3
cursorVisible: true
anchors.fill: parent
font.bold: true
font.pointSize: 14
}
}
Button{
height: 20
text: "Create this list"
onClicked: {
controller.addList(textInput.text)
myStackView.push(firstPage)
}
background: Rectangle{
id: rect1
anchors.fill: parent
radius: 20
border.color: "#88b6cf"
gradient: Gradient {
GradientStop { position: 0.0; color: "#fcfefe" }
GradientStop { position: 1.0; color: "#d5e8f3" }
}
}
}
}
}