QML动态列宽

时间:2015-10-06 23:07:41

标签: qt qml

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

旧路(非QML)是:

QTableView->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch );

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

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

    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
    }
    

    }

  3. 你知道如何帮助我吗?

3 个答案:

答案 0 :(得分:3)

要消除奇怪的大小调整,请手动调整最后一列不可调整大小,并使用列的widthChanged信号以及TabView的信号。以下代码产生的行为非常接近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
    }
}

答案 1 :(得分:0)

嗯,有一个我能想到的解决方案,但它并不漂亮:

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

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

答案 2 :(得分:0)

如果我的话,我们在这里。在这个时候,它并不完美,但它的解决方案。我响应调整主窗口大小的事件。不完美,因为不包含实际的NAME大小。有时在将名称jups放大到非理性的新值时。

    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
        {
        ...
        ...
        ...