I found a rather serious bug where TableView.contentX and TableView.contentY 
gets corrupted when you hide and reshow columns or rows (bug report here: 
https://bugreports.qt.io/browse/QTBUG-82535 
<https://bugreports.qt.io/browse/QTBUG-82535>). I'm looking for a workaround 
since this makes it impossible to use overlay items.

Resizing the width of a TableView with columnWidthProvider results in the 
contentX property having the wrong value. The following video demonstrate how 
the red rectangle, which has a fixed x of zero, jumps to the right as you 
resize the table view:

https://youtu.be/9YEaoTUR4Eo <https://youtu.be/9YEaoTUR4Eo>


import QtQuick 2.14
import QtQml.Models 2.14
import Qt.labs.qmlmodels 1.0


TableView {
    id: table        

    Timer {
        // Just resize the table twice on init to programatically reproduce the 
bug.
        // comment this entire item out to reproduce the bug with manual window 
resizing.
        id: timer
        interval: 1
        running: true
        repeat: true
        property int count: 0
        onTriggered: {
            if(count == 0){
                table.width = 400
            } else if(count == 2) {
                timer.running = false
            }
            count++
        }
    }

    // This "overlay" element doesn't stay put as it should since `x` is always 
zero.
    // https://doc.qt.io/qt-5/qml-qtquick-tableview.html#overlays-and-underlays
    Rectangle {
        width: 20
        height: table.contentHeight
        color: 'red'
    }

    onWidthChanged: {
        table.forceLayout()
        print('contentX', contentX) // shows that contextX does not match what 
is displayed.
    }

    // Bug happens when a zero-width column changes to a positive-width column.
    // So expand the table from less than 200 width to greater than 200 width 
to corrupt contentX.
    columnWidthProvider: function(col) {
        if(table.width > 200) {
            return 40
        } else {
            return col % 2 == 0 ? 0 : 60 // change the `0` width to `1` and the 
bug doesn't happen
        }
    }

    delegate: Rectangle {
        implicitHeight: 30
        border {
            width: 1
        }
        Text { text: display }
    }

    model: TableModel {
        TableModelColumn { display: 'col_1' }
        TableModelColumn { display: 'col_2' }
        rows: [
            { col_1: 'cell 1', col_2: 'cell 1' },
        ]
    }
}


_______________________________________________
Interest mailing list
Interest@qt-project.org
https://lists.qt-project.org/listinfo/interest

Reply via email to