首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >分别动态更改QML TableView元素行的高度

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

Stack Overflow用户
提问于 2016-04-12 21:26:24
回答 1查看 2.6K关注 0票数 2

在QML TableView中,有没有一种简单的方法来修改行的高度呢?

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

QTableView类有许多方法可以解决这个问题,比如setRowHeight(整行,整行)、resizeRowToContents(整行)或resizeRowsToContents()。

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

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

有没有人有同样的问题,可以给我一个技巧来解决它?

我的TableView:

代码语言:javascript
运行
复制
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函数:

代码语言:javascript
运行
复制
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;
        }
    }
}
EN

Stack Overflow用户

发布于 2016-04-12 21:46:35

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

代码语言:javascript
运行
复制
height: parent.height

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

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

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

我还没试过,但childrenRect可能就是你要找的:http://doc.qt.io/qt-5/qml-qtquick-item.html#childrenRect.height-prop

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

代码语言:javascript
运行
复制
height: (model.get(styleData.row)[styleData.role] === 0)?30:100
票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36574740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档