Search code examples
qtqmlshortcutmenubar

Assign MenuItem.Shortcut give Invalid attached object assignment


The following code:

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Layouts 1.3
import QtQuick.Controls 2.5
import QtQuick.Controls.Styles 1.4

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("This is my application title!")

    ColumnLayout
    {

        id: col1
        spacing: 2
  
        MenuBar
        {
            Menu {
                title: "File"
                MenuItem {
                    text: "Open"
                    Shortcut: "Ctrl+O"
                    onTriggered: console.log("Ctrl+O trigged")
                }
                MenuItem { text: "Paste link from Ctrl+V" }
                MenuItem { text: "Save log as" }
            }
            Menu {  title: "Help" }
            Menu {  title: "About" }
            Menu {  title: "Exit" }
        }
   }

Give the following error:

qrc:/main.qml:25:21: Invalid attached object assignment

the line on error is Shortcut: "Ctrl+O". The Qt documentation give example like this. What am I missing?

edit: added documentation link. edit 2: updated imports


Solution

  • In qml there are at least 2 groups of controls:

    • Qt Quick Controls 1
    • Qt Quick Controls 2

    These groups have components with the same one that is the cause of your error since you try to apply the property of the MenuItem from one group to another (check the imports so that you realize the error).

    Depending on which group you want to use, there are different options:

    Qt QuickControls 1

    import QtQuick 2.12
    
    import QtQuick.Controls 1.4
    
    ApplicationWindow {
        visible: true
        width: 640
        height: 480
        title: qsTr("This is my application title!")
    
        menuBar: MenuBar{
            Menu {
                title: "File"
                MenuItem {
                    text: "Open"
                    shortcut: "Ctrl+O"
                    onTriggered: console.log("Ctrl+O trigged")
                }
                MenuItem{ text: "Paste link from Ctrl+V" }
                MenuItem { text: "Save log as" }
            }
            Menu {  title: "Help" }
            Menu {  title: "About" }
            Menu {  title: "Exit" }
        }
    }
    

    Qt QuickControls 2

    import QtQuick 2.12
    
    import QtQuick.Controls 2.12
    
    ApplicationWindow {
        visible: true
        width: 640
        height: 480
        title: qsTr("This is my application title!")
    
        menuBar: MenuBar{
            Menu {
                title: "File"
                Action {
                    text: "Open"
                    shortcut: "Ctrl+O"
                    onTriggered: console.log("Ctrl+O trigged")
                }
                Action { text: "Paste link from Ctrl+V" }
                Action { text: "Save log as" }
            }
            Menu {  title: "Help" }
            Menu {  title: "About" }
            Menu {  title: "Exit" }
        }
    }
    

    Possibly you are going to have a similar problem with styles so it is recommended that you read this answer where I point out that using namespace can be a solution if you want to combine components of both modules.

    Note: QML is case sensitive, in the docs you indicate it indicates shortcut but you use Shortcut.