Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. QML and Qt Quick
  4. tableview selection broken after dynamically populating context menu structure via createObject

tableview selection broken after dynamically populating context menu structure via createObject

Scheduled Pinned Locked Moved QML and Qt Quick
tableviewmenumenuitemselectioncreateobject
1 Posts 1 Posters 1.3k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • E Offline
    E Offline
    eagain
    wrote on last edited by eagain
    #1

    My Application contains a QML tableview and a (right-click) context menu. With a statically defined (in the QML) menu structure all is working fine.
    Now ever since I began to fill the menu structure dynamically with the following function, the tableview no longer allows to select any cell by left-clicking. It is still possible to right-click to select a cell, but with the side effect of popping up the context menu. Also there are some "glictches" that allow a cell to be selected by left-clicking that occur sporadically after closing the context menu.

    I derived this code from a different example which I found on StackOverflow. Any ideas what is wrong with the particular piece of code?

    function funcSetMenuItems(menuItemNameList) {
        listViewContextMenu.clear()
        for (var menuItemIdx = 0; menuItemIdx < menuItemNameList.length; menuItemIdx++)
        {
            var menuItemName = menuItemNameList[menuItemIdx];
            var menuItemId = menuItemIdx;
            var component = Qt.createComponent("ListViewContextMenuItem.qml");
            var menuItem = component.createObject(listViewContextMenu, {"text": menuItemName, "thisMenuItemId": menuItemId});
            listViewContextMenu.insertItem(menuItemId, menuItem);
        }
    }
    

    By selectively commenting various parts, I was able to single out this line as "cause":

    var menuItem = component.createObject(listViewContextMenu, {"text": menuItemName, "thisMenuItemId": menuItemId});
    

    If this line is not present, the tableview will work normally. However, no entries in the menu are created either. duh.

    For completeness, this is the QML for the created menuitem, and the main QML

    ListViewContextMenuItem.qml

    import QtQuick 2.1
    import QtQuick.Controls 1.3
    
    MenuItem {
        property int thisMenuItemId: 0
        signal itemTriggered(int menuItemId)
        onTriggered: {
            itemTriggered(thisMenuItemId)
        }
    }
    

    Main.qml

    import QtQuick 2.4
    import QtQuick.Controls 1.3
    import QtGraphicalEffects 1.0
    import SORTFILTERPROXYMODELL 1.0
    
    Item {
        id: root
        anchors.fill: parent
    
        Connections {
            target: controller
            onDoSetMenuItems: {
                listViewContextMenu.funcSetMenuItems(menuItemNameList)
            }
        }
    
        Component
        {
            id: columnComponent
            TableViewColumn{width: ( listView.width - 20 ) / 4; delegate: blankColumnDelegate}
        }
    
        TableView {
            id: listView
            anchors.top: header.bottom; anchors.left: parent.left; anchors.right: parent.right; anchors.bottom: parent.bottom
            model: proxyModelViewer.isSorting ? null : proxyModelViewer
            property bool hasCreatedColumns: false
    
            onCurrentRowChanged: {
                controller.onSelectionRowChanged(model.getData(listView.currentRow, "objectId"))
                selection.clear()
                selection.select(currentRow)
            }
    
            SortFilterProxyModell {
                id: proxyModelViewer
                objectName: "proxyModelViewer"
                source: listViewModel
    
                onSourceChanged:
                {
                    if (    (listViewModel != null) ||
                            (typeof(listViewModel) != "undefined"))
                    {
                        var roleList = userRoleNames
                        for (var columnIdx = 0; columnIdx < listView.columnCount; columnIdx++)
                        {
                            listView.removeColumn(columnIdx)
                        }
                        for (var roleIdx = 0; roleIdx < roleList.length; roleIdx++)
                       {
                            var role = roleList[roleIdx]
                            console.log("addColumn #" + roleIdx + "role=" + role)
                            var tvc = columnComponent.createObject({"role": role, "title": role})
                            listView.addColumn(tvc)
                        }
                    } 
                }
            }
    
            Component {
                id: rowDelegate
                Rectangle { id: rootRowDelegate
                    visible: model ? (styleData.row < proxyModelViewer.count) : false
                    MouseArea { id: delegateMouse
                        anchors.fill: parent; anchors.bottomMargin: listView.borderWidth
                        acceptedButtons: Qt.RightButton
                        onPressed: if (mouse.button === Qt.RightButton) {
                                        listViewContextMenu.popup()
                                        listView.currentRow = styleData.row  
                                   }
                    }
                }
            }
    
            Component {
                id: blankColumnDelegate
                Item { anchors.fill: parent }
            }
        }
    
        Menu { id: listViewContextMenu
            function funcSetMenuItems(menuItemNameList) {
                listViewContextMenu.clear()
                for (var menuItemIdx = 0; menuItemIdx < menuItemNameList.length; menuItemIdx++)
                {
                    var menuItemName = menuItemNameList[menuItemIdx];
                    var menuItemId = menuItemIdx;
                    var component = Qt.createComponent("ListViewContextMenuItem.qml");
                    var menuItem = component.createObject(listViewContextMenu, {"text": menuItemName, "thisMenuItemId": menuItemId});
                    listViewContextMenu.insertItem(menuItemId, menuItem);
                }
            }
    //    Old way of initializing the menu
    //    MenuItem {
    //        text: qsTr('Stuff')
    //        onTriggered: controller.doStuff()
    //    }
        }
    }
    

    Sorry for the wall of text, and thank you for any suggestions.

    Fabian

    1 Reply Last reply
    0

    • Login

    • Login or register to search.
    • First post
      Last post
    0
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Get Qt Extensions
    • Unsolved