如何在 QML 中进行基于状态的模型更改
Posted
技术标签:
【中文标题】如何在 QML 中进行基于状态的模型更改【英文标题】:How to make state-based model change in QML 【发布时间】:2010-09-22 20:54:04 【问题描述】:我正在尝试制作一个基于 QML 的字典应用程序。它通过 XML RESTful API 获取单词定义并将它们显示在 ListView 中。我让它在这种基本模式下工作。但是现在我正在尝试为 ListView 实现两种状态:具有定义的标准视图和搜索失败时的“您的意思是”类型建议列表。
我当前的 ListView 代码是这样的:
ListView
SuggestionModelid:suggestionModel; currentWord : "test"
SuggestionDelegateid:suggestionDelegate
model : XmlModelid: standardModel; currentWord : "test"
delegate : ListDelegateid: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 声明中实例化模型和委托,因为解释器会抱怨创建特定于状态的对象。
【问题讨论】:
【参考方案1】:SuggestionDelegate 正在被实例化。委托属性需要一个组件,它将为它显示的每个项目实例化自己。因此,要提供 Component 而不是实例,您需要将 SuggestionDelegate 包装在 Component 中并在 PropertyChanges 中使用 Component id:
Component
id: suggestionDelegate
SuggestionDelegate
【讨论】:
【参考方案2】:虽然 Martin 的解决方案解决了我遇到的问题,但我还是想出了一个更好的 UI 设计。由于定义和建议视图是互斥的,我将每个视图实现为具有相同几何形状并根据当前状态显示或隐藏的自己的项目。这也允许漂亮的过渡动画。
【讨论】:
以上是关于如何在 QML 中进行基于状态的模型更改的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Cascades、Blackberry 10 中使用 Qt/QML/C++ 从另一个 qml 文件中更改一个 qml 文件中的标签文本?