如何通过Javascript访问QML ComboBox中使用的QAbstractListModel的角色

时间:2015-06-23 10:29:59

标签: javascript qt combobox qml qt5.4

我有一个基于QAbstractListModel的模型。

它实现了几种不同的角色来提供各种数据。

我已在model内设置了textRole以及ComboBox。这非常有效。

当用户从此ComboBox中选择一个项目(行)时,我需要运行一些Javascript来读取几个不同角色的Item个值并使用它们来执行有用的操作工作

但是,我找不到任何办法。示例ComboBox QML:

import QtQuick 2.4
import QtQuick.Controls 1.3

ComboBox {
    id: dropDownList
    model: myModel
    textRole: "display"
    onActivated: {
        console.log("dropDownList Activated");
        console.log("Read Model Value: " + model.display);
    }
}

我得到的控制台日志是:

qml: dropDownList Select Activated
qml: Read Model Value: undefined

display角色值由ComboBox本身正确显示。

我也试过了model[index].display,这给了

  

TypeError: Cannot read property 'display' of undefined

model.get(index)不支持

QAbstractListModel,并且没有该角色,因此不适合。

我相信这一定是可能的,因为ComboBox可以显示来自任意角色的文本。

1 个答案:

答案 0 :(得分:1)

您可以使用QuickControls 2 ComboBox delegateModel的未记录属性。

import QtQuick 2.4
import QtQuick.Controls 1.3

ComboBox {
    id: dropDownList
    model: myModel
    textRole: "display"
    onActivated: {
        console.log("dropDownList Activated");
        var currentItem = delegateModel.items.get(currentIndex)
        console.log("Read Model Value: " + currentItem.model.display);
    }
}

返回的项目是JavaScript对象,而不是QtObject,因此您无法在绑定中使用delegateModel.items.get()返回的对象,因为它没有Qml属性。

尽管未记录此属性,但在Customizing ComboBox示例中提到了设置用于自定义弹出窗口的模型时所提到的问题。

contentItem: ListView {
    clip: true
    implicitHeight: contentHeight
    model: control.popup.visible ? control.delegateModel : null
    currentIndex: control.highlightedIndex

    ScrollIndicator.vertical: ScrollIndicator { }
}