Search code examples
qtqmltableviewqt5qtquick2

How to get column number at mouse click for QtQuick2 TableView


I'm trying to handle mouse clicks on table cells. I need to respond to the right button only if I clicked in a certain cell. but I can't find how to catch the column number. A TableView from QtQuick 2.12 is used. Or maybe you can do without a column number? Tableview from QtQuickControls I, for various reasons, can not use.

TableView {
    id: table
    boundsBehavior: Flickable.StopAtBounds
    anchors.fill: parent
    columnSpacing: 0
    rowSpacing: 0
    anchors.rightMargin: 2
    anchors.leftMargin: 5
    anchors.bottomMargin: 5
    anchors.topMargin: 70
    clip: true

    model: TableModel {
        id: model
        Component.onCompleted: {
            model.init()
        }
    }

    delegate: Rectangle {
        id: tableDelegate

        implicitWidth: textDelegate.implicitWidth + textDelegate.padding * 2
        implicitHeight: 30
        border.width: 0

        TextField {
            id: textDelegate
            text: tabledata
            anchors.fill: parent
            anchors.verticalCenter: parent.verticalCenter
            clip: true
            horizontalAlignment: TextField.AlignHCenter
            verticalAlignment: TextField.AlignVCenter

            enabled: true

            background: Rectangle {
                border.color: "#e61d6887"
                color: "#e6ffffff"
                border.width: 1
            }
            selectByMouse: true

            MouseArea {
                id: mad
                anchors.fill: parent
                acceptedButtons: Qt.LeftButton | Qt.RightButton
                onClicked: {
                    switch(mouse.button){
                    case Qt.RightButton:
                        console.log("right button")
                        dialog.open()

                        break
                    case Qt.LeftButton:
                        console.log("left button")
                        break
                    default:
                        break
                    }
                }
            }
        }
    }
}

Solution

  • You have to use model.row and model.column (or row and column) to get the row or column in the delegate, respectively.

    // ...
    MouseArea {
        id: mad
        anchors.fill: parent
        acceptedButtons: Qt.LeftButton | Qt.RightButton
        onClicked: {
            console.log(model.row, model.column)
            // or
            // console.log(row, column)
            // ...
         }
    // ...
    

    I have reported the bug in the documentation: QTBUG-76529.