ContextMenu QML Type

Der angehängte Typ ContextMenu bietet eine Möglichkeit, ein Kontextmenü in einer plattformgerechten Weise zu öffnen. Mehr...

Import Statement: import QtQuick.Controls
Since: Qt 6.9

Eigenschaften

Signale

Detaillierte Beschreibung

ContextMenu kann an jede item angehängt werden, um ein Kontextmenü auf ein plattformspezifisches Ereignis hin anzuzeigen, wie z.B. einen Rechtsklick oder die Kontextmenütaste.

Pane {
    anchors.fill: parent

    ContextMenu.menu: Menu {
        MenuItem {
            text: qsTr("Eat Tomato")
            onTriggered: { /* ... */ }
        }
        MenuItem {
            text: qsTr("Throw Tomato")
            onTriggered: { /* ... */ }
        }
        MenuItem {
            text: qsTr("Squash Tomato")
            onTriggered: { /* ... */ }
        }
    }
}

Gemeinsame Nutzung von Kontextmenüs

Es ist möglich, ein Menu für mehrere angehängte Kontextmenü-Objekte freizugeben. Dies ermöglicht die Wiederverwendung eines einzigen Menüs, wenn die Elemente, die Kontextmenüs benötigen, gemeinsame Daten haben. Zum Beispiel:

pragma ComponentBehavior: Bound

import QtQuick
import QtQuick.Controls.Basic
import QtQuick.Templates as T

ApplicationWindow {
    width: 600
    height: 400
    visible: true

    component Tomato: Label {
        id: tomato
        objectName: text
        horizontalAlignment: Label.AlignHCenter
        verticalAlignment: Label.AlignVCenter
        width: Math.max(200, contentWidth * 1.5, contentWidth * 1.5)
        height: width
        color: skinColor

        function eat() { print("Ate " + text) }
        function ditch() { print("Threw " + text) }
        function squash() { print("Squashed " + text) }

        property color skinColor: "tomato"

        background: Rectangle {
            color: tomato.skinColor
            radius: width / 2
        }

        ContextMenu.menu: contextMenu
    }

    Menu {
        id: contextMenu

        readonly property Tomato triggerItem: parent as Tomato
        readonly property string triggerItemText: triggerItem?.text ?? ""

        MenuItem {
            text: qsTr("Eat %1").arg(contextMenu.triggerItemText)
            onTriggered: contextMenu.triggerItem.eat()
        }
        MenuItem {
            text: qsTr("Throw %1").arg(contextMenu.triggerItemText)
            onTriggered: contextMenu.triggerItem.ditch()
        }
        MenuItem {
            text: qsTr("Squash %1").arg(contextMenu.triggerItemText)
            onTriggered: contextMenu.triggerItem.squash()
        }
    }

    Row {
        anchors.centerIn: parent

        Tomato {
            text: qsTr("tomato")
        }

        Tomato {
            text: qsTr("really ripe tomato")
            skinColor: "maroon"
        }
    }
}

Leistung

ContextMenu erstellt sein Menu nur dann, wenn es angefordert wird. Ohne diese Optimierung würde Menu erstellt werden, wenn die enthaltende Komponente geladen wird, was typischerweise beim Start der Anwendung der Fall ist.

Es wird empfohlen, der Menu, die der Eigenschaft menu von ContextMenu zugewiesen ist, keine ID zu geben, wenn sie dort definiert ist, wo sie zugewiesen ist. Auf diese Weise wird diese Optimierung verhindert. Ein Beispiel:

Pane {
    anchors.fill: parent

    ContextMenu.menu: Menu {
        // This prevents lazy creation of the Menu.
        id: myMenu

        // ...
    }
}

Das Beispiel im Abschnitt Sharing context menus funktioniert, weil Menu getrennt von seiner Zuweisung definiert ist.

Interaktion mit anderen Menüs

Wenn ein Menu z.B. über TapHandler oder auf andere Weise geöffnet wird, wird das ContextMenu nicht gleichzeitig geöffnet. Dadurch können ältere Anwendungen, die vor der Einführung von ContextMenu geschrieben wurden, weiterhin wie erwartet funktionieren.

Eigenschaft Dokumentation

Diese Eigenschaft enthält das Kontextmenü, das geöffnet wird. Sie kann auf ein beliebiges Menu Objekt gesetzt werden.

Hinweis: Die dieser Eigenschaft zugewiesene Menu kann nicht mit einer ID versehen werden. Siehe Sharing context menus für weitere Informationen.


Signal Dokumentation

requested(point position)

Dieses Signal wird ausgesendet, wenn ein Kontextmenü angefordert wird.

Wenn es durch einen Klick mit der rechten Maustaste angefordert wurde, gibt position die Position des Klicks relativ zum übergeordneten Objekt an.

Das folgende Beispiel zeigt, wie man programmatisch ein Kontextmenü öffnet:

Button {
    id: button
    text: qsTr("Click me!")
    ContextMenu.onRequested: position => {
        const menu = buttonMenu.createObject(button)
        menu.popup(position)
    }
}

Component {
    id: buttonMenu
    Menu {
        MenuItem { text: qsTr("Open") }
    }
}

Wenn kein Menü gesetzt ist, aber dieses Signal verbunden ist, wird das Kontextmenü-Ereignis akzeptiert und nicht weitergegeben.

Hinweis: Der entsprechende Handler ist onRequested.

Siehe auch QContextMenuEvent::pos().


© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.