Qt 分别动态更改QML TableView元素行高度

Qt 分别动态更改QML TableView元素行高度,qt,qml,tableview,Qt,Qml,Tableview,在QML表格视图中,有没有一种简单的方法来修改给定索引的行高 我的问题是,我动态加载的数据是TableView的模型。我有一个“警告”列,我想在其中显示使用Qt RichText HTML标记(ul,li)的警告列表。但是,此列表高于包含它的单元格,并且存在y溢出 QTableView类有许多方法来解决此问题,例如setRowHeight(int-row,int-height)、resizeRowToContents(int-row)或resizeRowToContents() 但似乎QML等价

在QML表格视图中,有没有一种简单的方法来修改给定索引的行高

我的问题是,我动态加载的数据是TableView的模型。我有一个“警告”列,我想在其中显示使用Qt RichText HTML标记(ul,li)的警告列表。但是,此列表高于包含它的单元格,并且存在y溢出

QTableView类有许多方法来解决此问题,例如setRowHeight(int-row,int-height)、resizeRowToContents(int-row)或resizeRowToContents()

但似乎QML等价物没有这样的方法来轻松调整行的大小

rowDelegate可能会解决我的问题,但我不知道如何使用它分别修改行的高度(我的意思是给定其索引)

有没有人有同样的问题,可以给我一个解决它的窍门

我的桌面视图:

ListModel {
id: filesList
ListElement {
    name:""
    dir:""
    type:""
    status""
}
 }

 TableView {
id: filesTable
TableViewColumn {
    id:nameColumn
    role: "name"
    title: "Name"
    width: dropFiles.width*.2
}
TableViewColumn {
    id:dirColumn
    role: "dir"
    title: "Path"
    width: dropFiles.width*.8
}
TableViewColumn {
    id:typeColumn
    visible: false;
    role: "type"
    title: "Type"
    width: dropFiles.width*.2
}
TableViewColumn {
    id:statusColumn
    visible: false;
    role: "status"
    title: "Status"
    width: dropFiles.width*.3
}
rowDelegate: Rectangle {
    anchors {
        left: parent.left
        right: parent.right
        verticalCenter: parent.verticalCenter
    }
    height: parent.height
    MouseArea {
        anchors.fill: parent
        acceptedButtons: Qt.RightButton
        onClicked: {
            if (mouse.button == Qt.RightButton)
            {
                if(styleData.selected){
                    rowContextMenu.popup();
                }
                else {
                    filesTable.selection.deselect(0, filesTable.rowCount-1);
                    filesTable.selection.select(styleData.row);
                    rowContextMenu.popup();
                }
            }
        }
    }
}
anchors.fill: parent
selectionMode: SelectionMode.ExtendedSelection
model: filesList
 }
function displayParsingStatus(){
    for(var i= 0; i<newModel.files.length; ++i){
        switch(newModel.files[i].status){
            case 0:
                filesList.get(i).status="<font color=\"green\">Success</font>";
                break;
            case 1:
                var status ="";
                status += "<ul>";
                for(var j=0; j < newModel.files[i].warnings.length;j++){
                    status += "<li><font color=\"orange\">Warning: " + newModel.files[i].warnings[j] + "</font></li>";
                }
                status += "</ul>";
                filesList.get(i).status=status;
                break;
            case 2:
                filesList.get(i).status="<font color=\"red\"><b>Error: " + newModel.files[i].error + "</b></font>";
                break;
            case 3:
                filesList.get(i).status="Ignored";
                break;
        }
    }
}
更新我的TableView的JS函数:

ListModel {
id: filesList
ListElement {
    name:""
    dir:""
    type:""
    status""
}
 }

 TableView {
id: filesTable
TableViewColumn {
    id:nameColumn
    role: "name"
    title: "Name"
    width: dropFiles.width*.2
}
TableViewColumn {
    id:dirColumn
    role: "dir"
    title: "Path"
    width: dropFiles.width*.8
}
TableViewColumn {
    id:typeColumn
    visible: false;
    role: "type"
    title: "Type"
    width: dropFiles.width*.2
}
TableViewColumn {
    id:statusColumn
    visible: false;
    role: "status"
    title: "Status"
    width: dropFiles.width*.3
}
rowDelegate: Rectangle {
    anchors {
        left: parent.left
        right: parent.right
        verticalCenter: parent.verticalCenter
    }
    height: parent.height
    MouseArea {
        anchors.fill: parent
        acceptedButtons: Qt.RightButton
        onClicked: {
            if (mouse.button == Qt.RightButton)
            {
                if(styleData.selected){
                    rowContextMenu.popup();
                }
                else {
                    filesTable.selection.deselect(0, filesTable.rowCount-1);
                    filesTable.selection.select(styleData.row);
                    rowContextMenu.popup();
                }
            }
        }
    }
}
anchors.fill: parent
selectionMode: SelectionMode.ExtendedSelection
model: filesList
 }
function displayParsingStatus(){
    for(var i= 0; i<newModel.files.length; ++i){
        switch(newModel.files[i].status){
            case 0:
                filesList.get(i).status="<font color=\"green\">Success</font>";
                break;
            case 1:
                var status ="";
                status += "<ul>";
                for(var j=0; j < newModel.files[i].warnings.length;j++){
                    status += "<li><font color=\"orange\">Warning: " + newModel.files[i].warnings[j] + "</font></li>";
                }
                status += "</ul>";
                filesList.get(i).status=status;
                break;
            case 2:
                filesList.get(i).status="<font color=\"red\"><b>Error: " + newModel.files[i].error + "</b></font>";
                break;
            case 3:
                filesList.get(i).status="Ignored";
                break;
        }
    }
}
函数displayingparsingstatus(){

对于(var i=0;i您已经在设置QML委托元素的高度:

height: parent.height
它将高度绑定到父高度。 如果使用表达式设置高度,则每次更改表达式的任何元素时都会触发(并重新计算)

这就是为什么QML属性有一个通知信号

因此,如果要将高度绑定到其他元素,只需将其指定给height属性

我还没试过,但你要找的可能是childrenRect:

也可以使用三元运算符为属性赋值,即:

height: (model.get(styleData.row)[styleData.role] === 0)?30:100

我尝试使用childrenRect.height,但它不起作用。我还尝试使用三元运算符。我在ListElements中添加了一个名为“rowHeight”的属性,并在委托中使用它。它起作用,但我现在遇到了性能问题,因为我的列表中有14000多个元素。无论如何,感谢您的回答