QML TableView rowDelegate styleData.row 未定义

QML TableView rowDelegate styleData.row not defined

我正在尝试为 TableView 创建自定义行委托。根据 DocumentationrowDelegate 应该可以访问名为 styleData.row 的 属性。但是,当我尝试访问此 属性 时,它是未定义的。我使用调试器检查了 styleData 中的内容,row 丢失了:

我的代码很简单:

TableView {
    width: 500//DEBUG
    height: 300//DEBUG

    model: ListModel {
        ListElement {
            lectureName: "Baum1"
        }
        ListElement {
            lectureName: "Baum2"
        }
        ListElement {
            lectureName: "Baum3"
        }
        ListElement {
            lectureName: "Baum4"
        }
    }

    rowDelegate: HeaderRowDelegate {//simply a Rectangle with an in property called "modelRow"
        id: rowDelegate
        modelRow: {
            var data = styleData;
            return data.row;
        }
    }

    TableViewColumn {
        id: c1
        role: "lectureName"
        title: "TEST"
    }
}

您不必自己分配:由于 HeaderRowDelegate 组件已分配给 TableViewrowDelegate 属性,您的组件已经可以访问到 styleData.row 属性.

这是一个例子:

main.qml

import QtQuick 2.4
import QtQuick.Layouts 1.1
import QtQuick.Controls.Styles 1.2
import QtQuick.Controls 1.3

ApplicationWindow {
    id: app
    title: qsTr("Test")
    width: 800
    height: 600

    TableView {
        width: 500//DEBUG
        height: 300//DEBUG

        model: ListModel {
            ListElement {
                lectureName: "Baum1"
            }
            ListElement {
                lectureName: "Baum2"
            }
            ListElement {
                lectureName: "Baum3"
            }
            ListElement {
                lectureName: "Baum4"
            }
        }

        rowDelegate: RowDel {}        

        TableViewColumn {
            id: c1
            role: "lectureName"
            title: "TEST"
        }
    }
}

现在是行代表,RowDel.qml

import QtQuick 2.4

Rectangle {
    id: rowDel
    color: "blue"
    height: 60

    readonly property int modelRow: styleData.row ? styleData.row : 0

    MouseArea {
        anchors.fill: parent
        onClicked: {
            console.log("[!] log: " + modelRow);
        }
    }       
}

这里重要的是你可以直接从你的组件中引用 styleData.row(只要你使用这个精确的组件作为行委托就不会忘记)。

例如,如果您单击每个表视图行,您应该会在控制台日志中看到正确的行号:

qml: [!] log: 0
qml: [!] log: 1
qml: [!] log: 2
qml: [!] log: 3