Qt 动态列宽度

Qt 动态列宽度,qt,qml,Qt,Qml,我有4列的TableView。当我放大主窗口的宽度时,我也需要放大第一列的宽度 旧方法(非QML)是: 现在我做了一些类似下面的例子,但这并不完全完美 当我调整某些列的大小时,此构造将停止工作。当主窗口更改其大小时,所有列都保持实际状态并停止调整大小 当我将来添加新列(忘记重写这个代码)或动态添加一些列时,这也会停止工作 QML文件:: TableView { id: ccPanel model: ccModel TableViewColumn {

我有4列的
TableView
。当我放大主窗口的宽度时,我也需要放大第一列的宽度

旧方法(非QML)是:

现在我做了一些类似下面的例子,但这并不完全完美

  • 当我调整某些列的大小时,此构造将停止工作。当主窗口更改其大小时,所有列都保持实际状态并停止调整大小
  • 当我将来添加新列(忘记重写这个代码)或动态添加一些列时,这也会停止工作
  • QML文件::

    TableView {  
    
         id: ccPanel  
         model: ccModel
        TableViewColumn {
            id: ccName
            role: "name"
            title: "Name"
            width: ccPanel.width - ccSize.width - ccDate.width
        }
        TableViewColumn {
            id: ccSize
            role: "size"
            title: "Size"
            width: 60
        }
        TableViewColumn {
            id: ccDate
            role: "Date"
            title: "Datum"
            width: 85
        }
    }
    

    你知道如何帮助我吗?

    嗯,我可以想出一个解决方案,但它并不漂亮:

    基本上,您必须执行手动列管理,跟踪数组中的所有当前列,并且每次添加、删除或调整列的大小时,都必须执行一个函数来动态生成列宽的绑定:

    column.height = Qt.binding(function() { return property_evaluating_expressions })
    

    如果我想说的话,我们到了。在这个时候,它不是完美的,但它是解决方案。我对调整主窗口大小的事件作出响应。不完美,因为不包含实际的名称大小。在扩大名称的过程中,有时会不合理地将名称转换为新值

        TableView
        {
    
            id: ccPanel
            property var oldWidth: ccPanel.width
            model: ccModel
    
            onWidthChanged:
            {
                var newWidth = ccName.width + (ccPanel.oldWidth - ccName.width - ccDate.width - ccSize.width);
                if(newWidth > 19)
                {
                    ccName.width = newWidth
                }
                ccPanel.oldWidth = ccPanel.width;
            }
    
            TableViewColumn
            {
            ...
            ...
            ...
    

    要消除奇怪的大小调整,请手动使最后一列不可调整大小,并使用列的
    widthChanged
    信号以及选项卡视图中的信号。下面的代码生成一个非常接近Qt TableView头的行为

    TableView
    {
        id: ccPanel
        model: ccModel
        anchors.fill: parent
        onWidthChanged:ccName.width = Math.max(100, ccPanel.width - ccSize.width - ccDate.width)
    
        TableViewColumn
        {
            id: ccName
            role: "name"
            title: "Name"
            onWidthChanged: ccDate.width = Math.max(60, ccPanel.width - ccSize.width - ccName.width)
        }
        TableViewColumn
        {
            id: ccSize
            role: "size"
            title: "Size"
            width: 60
            onWidthChanged: ccDate.width = Math.max(85, ccPanel.width - ccSize.width - ccName.width)
        }
        TableViewColumn
        {
            resizable: false
            id: ccDate
            role: "Date"
            title: "Datum"
            width: 85
        }
    }
    

    如果将
    resizeable
    设置为
    false
    ,则应修复这些错误。但是我不知道用户是否应该能够调整列的大小。不,这个设置禁止用鼠标改变列的大小。这正是我的意思。
    TableView
    {
        id: ccPanel
        model: ccModel
        anchors.fill: parent
        onWidthChanged:ccName.width = Math.max(100, ccPanel.width - ccSize.width - ccDate.width)
    
        TableViewColumn
        {
            id: ccName
            role: "name"
            title: "Name"
            onWidthChanged: ccDate.width = Math.max(60, ccPanel.width - ccSize.width - ccName.width)
        }
        TableViewColumn
        {
            id: ccSize
            role: "size"
            title: "Size"
            width: 60
            onWidthChanged: ccDate.width = Math.max(85, ccPanel.width - ccSize.width - ccName.width)
        }
        TableViewColumn
        {
            resizable: false
            id: ccDate
            role: "Date"
            title: "Datum"
            width: 85
        }
    }