动态且单独更改 QML TableView Element 行高

Posted

技术标签:

【中文标题】动态且单独更改 QML TableView Element 行高【英文标题】:Change QML TableView Element rows height dynamically and separately 【发布时间】:2016-04-12 13:26:24 【问题描述】:

根据 QML TableView 中的索引,是否有一种简单的方法可以修改行高?

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

QTableView 类有很多方法可以解决这个问题,例如 setRowHeight(int row, int height)、resizeRowToContents(int row) 或 resizeRowsToContents()。

但似乎 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
 

更新我的 TableView 的 JS 函数:

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;
        
    

【问题讨论】:

【参考方案1】:

您已经在 QML 委托元素上设置了高度:

height: parent.height

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

这就是 QML 属性具有 NOTIFY 信号的原因。

因此,如果您想将高度绑定到其他元素,只需将其分配给 height 属性即可。

我还没有尝试过,但 childrenRect 可能是您正在寻找的:http://doc.qt.io/qt-5/qml-qtquick-item.html#childrenRect.height-prop

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

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

【讨论】:

我尝试使用 childrenRect.height 但它没有用。我也尝试使用三元运算符。我在 ListElements 中添加了一个名为“rowHeight”的属性,并在委托中使用它。它有效,但我现在遇到了性能问题,因为我的列表中有超过 14,000 个元素。不管怎样,谢谢你的回答

以上是关于动态且单独更改 QML TableView Element 行高的主要内容,如果未能解决你的问题,请参考以下文章

如何在鼠标事件上更改 QML 的 TableView 中一行的颜色?

如何让qml TableView行高动态适应内容

Qt5 - 在 QML TableView 中显示动态数据模型

QML TableView 鼠标区域不会将点击传播到选择模型

来自文件的 QML TableView

QML StackView:动态更改replaceEnter/Exit动画