Menu QML Type

弹出菜单,可用作上下文菜单或弹出菜单。更多

Import Statement: import QtQuick.Controls
Inherits:

Popup

属性

方法

  • Action actionAt(int index) (since QtQuick.Controls 2.3 (Qt 5.10))
  • void addAction(Action action) (since QtQuick.Controls 2.3 (Qt 5.10))
  • void addItem(Item item)
  • void addMenu(Menu menu) (since QtQuick.Controls 2.3 (Qt 5.10))
  • void dismiss() (since QtQuick.Controls 2.3 (Qt 5.10))
  • void insertAction(int index, Action action) (since QtQuick.Controls 2.3 (Qt 5.10))
  • void insertItem(int index, Item item)
  • void insertMenu(int index, Menu menu) (since QtQuick.Controls 2.3 (Qt 5.10))
  • Item itemAt(int index)
  • Menu menuAt(int index) (since QtQuick.Controls 2.3 (Qt 5.10))
  • void moveItem(int from, int to)
  • void popup(MenuItem item) (since QtQuick.Controls 2.3 (Qt 5.10))
  • void popup(Item parent, MenuItem item) (since QtQuick.Controls 2.3 (Qt 5.10))
  • void popup(point pos, MenuItem item) (since QtQuick.Controls 2.3 (Qt 5.10))
  • void popup(Item parent, point pos, MenuItem item) (since QtQuick.Controls 2.3 (Qt 5.10))
  • void popup(real x, real y, MenuItem item) (since QtQuick.Controls 2.3 (Qt 5.10))
  • void popup(Item parent, real x, real y, MenuItem item) (since QtQuick.Controls 2.3 (Qt 5.10))
  • void removeAction(Action action) (since QtQuick.Controls 2.3 (Qt 5.10))
  • void removeItem(Item item) (since QtQuick.Controls 2.3 (Qt 5.10))
  • void removeMenu(Menu menu) (since QtQuick.Controls 2.3 (Qt 5.10))
  • Action takeAction(int index) (since QtQuick.Controls 2.3 (Qt 5.10))
  • MenuItem takeItem(int index) (since QtQuick.Controls 2.3 (Qt 5.10))
  • Menu takeMenu(int index) (since QtQuick.Controls 2.3 (Qt 5.10))

详细说明

本地 macOS 菜单。

非本地Material 风格菜单。

菜单有两种主要用途:

  • 上下文菜单;例如,右键单击后显示的菜单
  • 弹出式菜单;例如,点击按钮后显示的菜单

作为上下文菜单使用时,建议使用popup() 打开菜单。除非明确指定了位置,否则在有鼠标光标的桌面平台上,菜单会定位在鼠标光标处,否则会居中显示在其父项上。

MouseArea {
    anchors.fill: parent
    acceptedButtons: Qt.LeftButton | Qt.RightButton
    onClicked: (mouse) => {
        if (mouse.button === Qt.RightButton)
            contextMenu.popup()
    }
    onPressAndHold: (mouse) => {
        if (mouse.source === Qt.MouseEventNotSynthesized)
            contextMenu.popup()
    }

    Menu {
        id: contextMenu
        MenuItem { text: "Cut" }
        MenuItem { text: "Copy" }
        MenuItem { text: "Paste" }
    }
}

作为弹出式菜单使用时,最简单的方法是通过使用相应属性指定所需的xy 坐标来指定位置,然后调用open() 打开菜单。

Button {
    id: fileButton
    text: "File"
    onClicked: menu.open()

    Menu {
        id: menu
        y: fileButton.height

        MenuItem {
            text: "New..."
        }
        MenuItem {
            text: "Open..."
        }
        MenuItem {
            text: "Save"
        }
    }
}

如果按钮在点击时也要关闭菜单,则使用Popup.CloseOnPressOutsideParent 标志:

    onClicked: menu.visible = !menu.visible

    Menu {
        id: menu
        // ...
        closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutsideParent

QtQuick.Controls 2.3 (Qt XML 5.10) 起,也可以在 Menu.Controls 2.3 中创建子菜单并声明 Action 对象:

Menu {
    Action { text: "Cut" }
    Action { text: "Copy" }
    Action { text: "Paste" }

    MenuSeparator { }

    Menu {
        title: "Find/Replace"
        Action { text: "Find Next" }
        Action { text: "Find Previous" }
        Action { text: "Replace" }
    }
}

在有鼠标光标的桌面平台上,子菜单默认为cascading 。非层叠菜单一次显示一个菜单,并位于父菜单的中心。

通常情况下,菜单项被静态声明为菜单的子菜单,但 Menu 也提供了动态访问addinsertmoveremove 项的 API。可以使用itemAt() 或contentChildren 访问菜单中的项目。

虽然MenuItems 最常用于菜单,但它可以包含任何类型的项目。

边距

由于继承自 Popup,Menu 支持margins 。默认情况下,所有内置样式都为菜单的边距指定了0 ,以确保菜单保持在窗口的范围内。如果要让菜单跳出窗口(例如以动画形式移动到视图中),可将 margins 属性设置为-1

动态生成菜单项

您可以通过Instantiator动态对象创建来动态创建菜单项。

使用实例器

您可以使用Instantiator 动态创建菜单项。下面的代码展示了如何实现 "最近文件 "子菜单,其中的项目来自存储在设置中的文件列表:

Menu {
    title: qsTr("File")

    Menu {
        id: recentFilesMenu
        title: qsTr("Recent Files")
        enabled: recentFilesInstantiator.count > 0

        Instantiator {
            id: recentFilesInstantiator
            model: settings.recentFiles
            delegate: MenuItem {
                text: settings.displayableFilePath(modelData)
                onTriggered: loadFile(modelData)
            }

            onObjectAdded: (index, object) => recentFilesMenu.insertItem(index, object)
            onObjectRemoved: (index, object) => recentFilesMenu.removeItem(object)
        }

        MenuSeparator {}

        MenuItem {
            text: qsTr("Clear Recent Files")
            onTriggered: settings.clearRecentFiles()
        }
    }
}

使用动态对象创建

你也可以使用Qt.createComponent() 从 QML 文件动态加载一个组件。一旦组件准备就绪,你就可以调用其createObject() 方法来创建该组件的实例。

Row {
    anchors.centerIn: parent

    Component {
        id: menuItemComponent

        MenuItem {}
    }

    Button {
        id: button
        text: "Menu"
        onClicked: menu.open()
        Menu {
            id: menu
        }
    }

    Button {
        text: "Add item"
        onClicked: {
            onClicked: {
                let menuItem = menuItemComponent.createObject(
                    menu.contentItem, { text: qsTr("New item") })
                menu.addItem(menuItem)
            }
        }
    }
}

自 Qt 6.8 起,菜单根据平台的不同提供了三种不同的实现方式。您可以通过设置popupType 来选择哪一种。这将让你控制菜单是显示为一个单独的窗口、作为父窗口中的一个项目,还是显示为一个本地菜单。有关这些选项的更多信息,请访问here

默认的popupType 由样式决定。例如,macOS 风格将其设置为Popup.Native ,而Imagine 风格则使用Popup.Window (当风格未设置弹出式类型时,默认值为 )。如果你在菜单中添加了自定义功能,并希望无论使用哪种样式都能使用这些功能,就应该明确地将弹出类型设置为Popup.Window (或Popup.Item )。另一种方法是设置Qt::AA_DontUseNativeMenuWindows application attribute 。这将禁用整个应用程序的本地上下文菜单,而与样式无关。

Popup.Item 在所有平台上都受支持,但Popup.Window 通常只在桌面平台上受支持。此外,如果菜单位于native menubar 中,菜单也将是本地的。如果菜单是另一个菜单中的子菜单,则由父(或根)菜单决定类型。

使用本地菜单时的限制

popupType 设置为Popup.Native 时,与使用Popup.ItemPopup.Window 相比,存在一些限制和差异。

API 差异

使用本地菜单时,所有平台都只支持菜单 API 的一个子集:

此外,在某些平台上,显示弹出窗口(例如使用open() 或popup() )将是一个阻塞调用。这意味着在菜单再次关闭之前,调用不会返回,这会影响应用程序的逻辑。如果您的应用程序面向多个平台,因此有时会在不支持本地菜单的平台上运行,这一点尤其需要考虑。在这种情况下,例如,popupType 将返回Popup.Item ,而对open() 的调用将不会阻塞。

MenuItem 等项目仍会通过发出信号等方式对相应本地菜单项的点击做出反应,但会被本地对应项目取代。

渲染差异

本地菜单是使用平台上可用的本地菜单 API 实现的。因此,这些菜单及其所有内容都将由平台而非 QML 渲染。这意味着delegate 不会用于渲染。不过,它将始终被实例化(但隐藏),这样,诸如onCompleted() 等函数的执行与平台和popupType 无关。

支持的平台

本地菜单目前支持以下平台:

  • 安卓
  • iOS
  • Linux(仅在使用 GTK+ 平台主题运行时可作为独立上下文菜单使用)
  • MacOS
  • Windows

另请参阅 Customizing Menu(自定义菜单)、MenuItemMenu Controls(菜单控件)、Popup Controls(弹出式控件)、Dynamic QML Object Creation from JavaScript(从 JavaScript 创建动态 QML 对象)、Popup type[QML]popupType

属性文档

cascade : bool [since QtQuick.Controls 2.3 (Qt 5.10)]

该属性表示菜单是否级联其子菜单。

默认值取决于具体平台。在有鼠标光标的桌面平台上,默认情况下菜单是级联的。非级联菜单每次显示一个菜单,并位于父菜单的中心。

注: 菜单打开时,更改该属性的值不会产生任何影响。

注意: 只有在使用non-native Menu 时才支持该属性。

该属性在 QtQuick.Controls 2.3 (Qt 5.10) 中引入。

另请参阅 overlap


contentData : list<QtObject> [default]

该属性保存内容数据列表。

该列表包含所有在 QML 中声明为菜单子对象的对象,以及分别使用addItem() 和insertItem() 方法动态添加或插入的项目。

注意: contentChildren 不同,contentData 包含非可视 QML 对象。插入或移动项目时不会重新排序。

另请参阅 Item::datacontentChildren


contentModel : model [read-only]

该属性包含用于显示菜单项的模型。

内容模型用于可视化目的。它可以作为模型分配给显示菜单内容的内容项。

Menu {
    id: menu
    contentItem: ListView {
        model: menu.contentModel
    }
}

该模型允许将菜单项静态声明为菜单的子项。


count : int [read-only, since QtQuick.Controls 2.3 (Qt 5.10)]

该属性保存项目的数量。

该属性在 QtQuick.Controls 2.3 (Qt 5.10) 中引入。


currentIndex : int [since QtQuick.Controls 2.3 (Qt 5.10)]

该属性保存当前高亮显示项的索引。

菜单项可通过鼠标悬停或键盘导航高亮显示。

注意: 只有在使用non-native Menu 时才支持该属性。

该属性在 QtQuick.Controls 2.3 (Qt 5.10) 中引入。

另请参阅 MenuItem::highlighted


delegate : Component [since QtQuick.Controls 2.3 (Qt 5.10)]

该属性包含用于创建项目以显示操作的组件。

Menu {
    Action { text: "Cut" }
    Action { text: "Copy" }
    Action { text: "Paste" }
}

注意: 委托只有在使用non-native Menu 时才可见。

该属性在 QtQuick.Controls 2.3 (Qt 5.10) 中引入。

另请参阅 Action


focus : bool

该属性表示弹出窗口是否需要焦点。

当弹出窗口实际收到焦点时,activeFocustrue 。有关详细信息,请参阅 Qt Quick 中的 Keyboard Focus(键盘焦点)

默认值为true

注意: 只有在使用non-native Menu 时才支持此属性。

另请参阅 activeFocus


icon group

icon.cache : bool

icon.color : color

icon.height : int

icon.name : string

icon.source : url

icon.width : int

该属性组在QtQuick.Controls 6.5 中添加。

名称说明
名称此属性包含要使用的图标名称。

图标将从平台主题中加载。如果在主题中找到该图标,则将始终使用该图标;即使icon.source 也已设置。如果找不到图标,则将使用icon.source 代替。

有关主题图标的更多信息,请参阅QIcon::fromTheme() 。

来源该属性包含要使用的图标名称。

图标将作为普通图片加载。

如果icon.name 已设置并指向一个有效的主题图标,则将始终使用该图标而非该属性。

宽度该属性表示图标的宽度。

图标的宽度永远不会超过此值,但必要时会缩小。

height该属性用于保存图标的高度。

图标的高度永远不会超过此值,但必要时会缩小。

颜色该属性用于保存图标的颜色。

除非颜色设置为"transparent" ,否则图标将使用指定的颜色着色。

缓存此属性用于指定是否缓存图标。

默认值为 true。

更多信息,请参阅cache

该属性在QtQuick.Controls 2.13 中引入。

注意: 只有在使用non-native Menu 时才支持该属性。

另请参阅 AbstractButton::text,AbstractButton::display, 以及 Qt Quick Controls 中的图标


overlap : real [since QtQuick.Controls 2.3 (Qt 5.10)]

该属性保存菜单与其父菜单水平重叠的像素数。

该属性仅在菜单用作层叠子菜单时有效。

默认值与样式有关。

注意: 菜单打开时,更改该属性的值不会产生任何影响。

注意: 只有在使用non-native Menu 时才支持该属性。

该属性在 QtQuick.Controls 2.3 (Qt 5.10) 中引入。

另请参阅 cascade


title : string

该属性包含菜单的标题。

当菜单是子菜单时,菜单标题通常显示在菜单项的文本中;当菜单是菜单栏中的工具按钮时,菜单标题通常显示在工具按钮的文本中。


方法文档

在有鼠标光标的桌面平台上,在鼠标光标处打开菜单,否则将菜单居中对齐parent 项目。

菜单可选择对齐到特定的菜单itemcurrent. 如果没有指定itemcurrentIndex 将被设置为-1

此 QML 方法在 QtQuick.Controls 2.3 (Qt 5.10) 中引入。

另请参阅 Popup::open() 。


在弹出式菜单坐标系中的指定位置pos 打开菜单,即相对于其parent 项的坐标。

菜单可以选择与特定菜单item 对齐。current. 如果没有指定itemcurrentIndex 将被设置为-1

此 QML 方法在 QtQuick.Controls 2.3 (Qt 5.10) 中引入。

另请参阅 Popup::open() 。


在弹出坐标系中的指定位置x,y 打开菜单,即相对于其parent 项的坐标。

菜单可以选择与特定菜单item 对齐。current. 如果没有指定itemcurrentIndex 将被设置为-1

此 QML 方法在 QtQuick.Controls 2.3 (Qt 5.10) 中引入。

另请参阅 dismiss() 和Popup::open() 。


[since QtQuick.Controls 2.3 (Qt 5.10)] Action actionAt(int index)

返回index 处的操作,如果索引无效或指定索引处没有操作,则返回null

该方法在 QtQuick.Controls 2.3 (Qt 5.10) 中引入。


[since QtQuick.Controls 2.3 (Qt 5.10)] void addAction(Action action)

action 添加到该菜单的末尾。

此方法在 QtQuick.Controls 2.3 (Qt 5.10) 中引入。


void addItem(Item item)

item 添加到项目列表的末尾。


[since QtQuick.Controls 2.3 (Qt 5.10)] void addMenu(Menu menu)

menu 作为子菜单添加到该菜单的末尾。

此方法在 QtQuick.Controls 2.3 (Qt 5.10) 中引入。


[since QtQuick.Controls 2.3 (Qt 5.10)] void dismiss()

关闭该菜单所属层级中的所有菜单。

注意: close() 只关闭一个菜单及其子菜单(使用non-native menus 时),而dismiss() 则关闭整个菜单层次结构,包括父菜单。在实践中,close() 适用于在菜单层次结构中实现导航,而dismiss() 则是关闭整个菜单层次结构的适当方法。

该方法在 QtQuick.Controls 2.3 (Qt 5.10) 中引入。

另请参阅 popup() 和Popup::close()。


[since QtQuick.Controls 2.3 (Qt 5.10)] void insertAction(int index, Action action)

index 插入action 。索引位于菜单中的所有项目内。

该方法在 QtQuick.Controls 2.3 (Qt 5.10) 中引入。


void insertItem(int index, Item item)

index 插入item


[since QtQuick.Controls 2.3 (Qt 5.10)] void insertMenu(int index, Menu menu)

index 处插入menu 作为子菜单。索引位于菜单中的所有项目内。

该方法在 QtQuick.Controls 2.3 (Qt 5.10) 中引入。


Item itemAt(int index)

返回位于index 的项目,如果不存在,则返回null


返回index 处的子菜单,如果索引无效或指定索引处没有子菜单,则返回null

此方法在 QtQuick.Controls 2.3 (Qt 5.10) 中引入。


void moveItem(int from, int to)

移动一个项目from 一个索引to 另一个索引。


[since QtQuick.Controls 2.3 (Qt 5.10)] void removeAction(Action action)

移除并销毁指定的action

该方法在 QtQuick.Controls 2.3 (Qt 5.10) 中引入。


[since QtQuick.Controls 2.3 (Qt 5.10)] void removeItem(Item item)

移除并销毁指定的item

该方法在 QtQuick.Controls 2.3 (Qt 5.10) 中引入。


[since QtQuick.Controls 2.3 (Qt 5.10)] void removeMenu(Menu menu)

移除并销毁指定的menu

该方法在 QtQuick.Controls 2.3 (Qt 5.10) 中引入。


[since QtQuick.Controls 2.3 (Qt 5.10)] Action takeAction(int index)

删除并返回index 中的操作。索引位于菜单中的所有项目内。

注意: 操作的所有权将转移给调用者。

此方法在 QtQuick.Controls 2.3 (Qt 5.10) 中引入。


[since QtQuick.Controls 2.3 (Qt 5.10)] MenuItem takeItem(int index)

index 删除并返回项目。

注意: 项的所有权将转移给调用者。

此方法在 QtQuick.Controls 2.3 (Qt 5.10) 中引入。


[since QtQuick.Controls 2.3 (Qt 5.10)] Menu takeMenu(int index)

删除并返回位于index 的菜单。索引位于菜单中的所有项目内。

注意: 菜单的所有权将转移给调用者。

此方法在 QtQuick.Controls 2.3 (Qt 5.10) 中引入。


© 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.