[Interest] Seeking workaround for TableView contentX|contentY bug when hiding columns

Patrick Stinson patrickkidd at gmail.com
Sun May 10 03:50:38 CEST 2020


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' },
        ]
    }
}


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20200509/a59993d3/attachment.html>


More information about the Interest mailing list