如何在QML中进行基于状态的模型更改

时间:2010-09-22 20:54:05

标签: qt listview model state qml

我正在尝试制作基于QML的字典应用程序。它通过XML RESTful API获取单词定义,并将它们显示在ListView中。我让它在这个基本模式下工作。但是现在我正在尝试为ListView实现两种状态:带有定义的标准视图和搜索失败时的“你是说”类型建议列表。

我目前的ListView代码是这样的:

ListView
{
    SuggestionModel{id:suggestionModel; currentWord : "test"}
    SuggestionDelegate{id:suggestionDelegate}
    model : XmlModel{id: standardModel; currentWord : "test"}
    delegate : ListDelegate{id:standardDelegate}
    clip : true
    anchors.top : hbox.bottom
    y : hbox.height + 3
    width : parent.width
    height : parent.height - hbox.height
        id : list
        states :
                State { name: "suggestion"; when: list.model == suggestionModel ||
                        list.model.status ==  XmlListModel.Ready && list.count == 0
                PropertyChanges {
                    target: list
                    model : suggestionModel
                    delegate : suggestionDelegate
                }
            }

        focus : true
        keyNavigationWraps : true
    }

给出了这个错误:

Unable to assign QObject* to QDeclarativeComponent*

表示PropertyChanges声明。还有一个绑定循环,但这不是一个我无法修复的问题。我的问题是如何定义状态。我无法在State声明中实例化模型和委托,因为解释器会抱怨创建一个特定于州的对象。

2 个答案:

答案 0 :(得分:2)

SuggestionDelegate正在实例化。 delegate属性需要一个Component,它将为它显示的每个项目实例化它自己。因此,要提供Component而不是实例,您需要将SuggestionDelegate包装在Component中并使用PropertyChanges中的Component id:

Component {
    id: suggestionDelegate
    SuggestionDelegate { }
}

答案 1 :(得分:0)

虽然Martin的解决方案解决了我遇到的问题,但我想出了一个更好的UI设计。由于定义和建议视图是互斥的,因此我将每个实现为具有相同几何的自己的项目,并根据当前状态显示或隐藏。这也允许很好的过渡动画。