Qt QML Почему эти ListView и ListModel не совместимы? - PullRequest
1 голос
/ 05 июля 2019

У меня проблема с ListView и простым ListModel;

import QtQuick 2.12
import QtQuick.Controls 2.12

ApplicationWindow
{
    id: app
    visible: true
    width: 640
    height: 480
    property int bheight: 48

    ListModel
    {
        id: jmodel
    }

    function dosomething1()
    {
        jmodel.clear();
        jmodel.append({"atext":"hello"})
    }

    function dosomething2()
    {
        jmodel.clear();
        jmodel.append({"atext":"hello","btext":"world"});
    }

    ListView
    {
        id: alist
        width: parent.width
        height: parent.height - bheight
        model: jmodel
        delegate: Item
        {
            width: app.width
            height: 48
            Row
            {
                spacing: 8
                Text
                {
                    text: model.atext || ""
                }

                Text
                {
                    text: model.btext || ""
                }
            }
        }
    }

    Row
    {
        height: bheight
        anchors.top: alist.bottom
        Button
        {
            // press "plan A" first and it will say "hello"
            // press "plan B" after and it will remain "hello"
            // pressing A & B will NOT toggle
            text: "Plan A"
            onClicked: dosomething1();
        }

        Button
        {
            // press "plan B" first and it will say "hello world"
            // press "plan A" after and it will say "hello"
            // pressing A & B will toggle
            text: "Plan B"
            onClicked: dosomething2();
        }
    }

}

Я не могу заставить его работать последовательно. Может быть, чего-то не хватает, или я не понимаю.

Нажатие «Plan A» скажет «привет», а после нажатие «Plan B» не изменит его.

Но

При нажатии «Plan B» сначала произойдет «Hello World», а после этого «Plan A» и «Plan B» переключатся между «Hello World» и «Hello».

Это не должно зависеть от того, какая кнопка нажата первой, я очищаю модель каждый раз.

Я пробовал это на Qt5.12.3 и 5.9, и без изменений.

обновление

После ответа @eyllanesc я обновил свой код, вместо этого создавая новую модель для каждого обновления. Это работает, но я не знаю, есть ли у меня утечка памяти.

это мой код:

import QtQuick 2.12
import QtQuick.Controls 2.12

ApplicationWindow
{
    id: app
    visible: true
    width: 640
    height: 480
    property int bheight: 48

    Component
    {
        id: jmodel
        ListModel {}
    }

    function dosomething1()
    {
        var m = jmodel.createObject()
        m.append({"atext":"hello"})
        alist.model = m;
    }

    function dosomething2()
    {
        var m = jmodel.createObject()
        m.append({"atext":"hello","btext":"world"});
        alist.model = m;
    }

    ListView
    {
        id: alist
        width: parent.width
        height: parent.height - bheight
        delegate: Item
        {
            width: app.width
            height: 48
            Row
            {
                spacing: 8
                Text
                {
                    text: model.atext || ""
                }

                Text
                {
                    text: model.btext || ""
                }
            }
        }
    }

    Row
    {
        height: bheight
        anchors.top: alist.bottom
        Button
        {
            text: "Plan A"
            onClicked: dosomething1();
        }

        Button
        {
            text: "Plan B"
            onClicked: dosomething2();
        }
    }



}

1 Ответ

0 голосов
/ 06 июля 2019

Как документы указывают:

Модификация моделей списка

Модификация моделей списка Содержимое ListModel может быть создано и изменено с использованием команды clear (), append (), set (), insert () и setProperty () методы.Например:
Component {
    id: fruitDelegate
    Item {
        width: 200; height: 50
        Text { text: name }
        Text { text: '$' + cost; anchors.right: parent.right }

        // Double the price when clicked.
        MouseArea {
            anchors.fill: parent
            onClicked: fruitModel.setProperty(index, "cost", cost * 2)
        }
    }
} 

Обратите внимание, что при динамическом создании содержимого набор доступных свойств не может быть изменен после установки.Какие бы свойства не были добавлены в модель в первый раз, это единственные разрешенные свойства в модели.

(выделение добавлено)

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

  • В случае 1 ваша модель изначально имеет только свойство atext, а затем вы хотите добавить свойство btext, но Qt не разрешает его.

  • В случае, если ваша модель имеет свойства atext и btext, вы просто переписываете свойство atext, чтобы btext все еще существовал и имел значение null.

Решением в этом случае является установка btext со значением по умолчанию в случае 1:

function dosomething1()
{
    jmodel.clear();
    jmodel.append({"atext":"hello", "btext":""}) // <----
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...