在QAbstractListModel中,没有为QML ComboBox定义具有多个角色的modelData

时间:2016-01-08 18:34:32

标签: python qt qml qtquick2 pyqt5

这似乎与此处相同(未答复)问题:QML Combobox reports ReferenceError: modelData is not defined。我能找到的QT数据库中最近的(已关闭的)错误是:https://bugreports.qt.io/browse/QTBUG-31135所以我不确定这是同一个问题。我正在运行PyQt5 v5.5和python 3.4.3。

我正在PyQt5中实现一个QAbstractListModel,并将代码简化为手头的问题:

# ExampleModel.py

class ExampleModel(QAbstractListModel):

    def __init__(self, parent=None):
        super().__init__(parent)
        self.items = []

        for t in range(0,10):
            self.items.append({'text': t, 'myother': 'EXAMPLE'})

    def data(self, index, role):
        key = self.roleNames()[role]
        return self.items[index.row()][key.decode('utf-8')]

    def rowCount(self, parent=None):
        return len(self.items)

    def roleNames(self):
        return {Qt.UserRole + 1: b'text',
                Qt.UserRole + 2: b'myother'}

相关的QML:

# example.qml
...
ComboBox { // Displays blank entires + throws ReferenceError
    id: comboExample
    model: ExampleModel{}
    textRole: 'text'  # This was the missing line to make this work.
}

ListView {  // Works Correctly
    id: listExample
    model: ExampleModel{}
    delegate: Text {
        text: myname + " " + myother
    }
}
...

当我运行它时,组合框有10个空白条目,控制台错误日志显示:

  

[path] /ComboBox.qml:562:ReferenceError:未定义modelData

(x 10)

现在,如果我将上面的ExampleModel.py中的roleNames()代码修改为以下内容:

def roleNames(self):
    return {Qt.UserRole + 1: b'myname'}

ComboBox正常工作。

我在这里错过了一个关键概念吗?我不想两次实现我的模型(一次用于此ComboBox解决方法。)

修改

通过将Mitch的建议添加到上面的example.qml,此问题已修复。 代码已相应更新。

1 个答案:

答案 0 :(得分:3)

您需要将textRole设置为您要显示的角色的名称("text",在您的情况下)。

文档可以更加清楚,因此我创建了bug report