菜单 QML 类型

菜单弹出窗口,可以用作上下文菜单或弹出菜单。 更多...

导入语句import QtQuick.Controls
继承

弹出窗口

属性

方法

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

详细信息

菜单有两个主要用途

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

当用作上下文菜单时,通过调用 popup() 打开菜单是推荐的方式。除非显式指定位置,否则在具有鼠标光标的桌面平台上,菜单定位于鼠标光标处,否则在父项上方居中。

MouseArea {
    anchors.fill: parent
    acceptedButtons: Qt.LeftButton | Qt.RightButton
    onClicked: {
        if (mouse.button === Qt.RightButton)
            contextMenu.popup()
    }
    onPressAndHold: {
        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 {
    // ...
    closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutsideParent

自QtQuick.Controls 2.3(Qt 5.10)以来,还可以在菜单内部创建子菜单并声明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" }
    }
}

子菜单默认为桌面平台上带有鼠标光标的平台上的级联。非级联菜单一次显示一个菜单,并相对于父菜单居中。

通常,菜单项作为菜单的子项静态声明,但菜单还提供了addIteminsertItemmoveItem以及removeItem动态添加菜单项的API。可以使用itemAt()或contentChildren访问菜单中的项。

尽管MenuItems通常与菜单一起使用,但菜单可以包含任何类型的项。

边距

由于它继承了Popup,菜单支持margins属性。默认情况下,所有内置样式都指定菜单的边距为0,以确保菜单保持在窗口范围内。要允许菜单超出窗口范围(例如,为了动画显示菜单项),请将边距属性设置为-1

动态生成菜单项

您可以使用Instantiator动态对象创建动态创建菜单项。

使用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.addMenu(menuItem)
            }
        }
    }
}

另请参阅 自定义菜单MenuItem菜单控件弹出控件以及从JavaScript动态创建QML对象

属性说明

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

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

默认值因平台而异。在具有鼠标光标的桌面平台上,菜单默认为级联。非级联菜单一次显示一个菜单,并居中在父菜单上方。

注意:切换菜单打开时的属性值没有效果。

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

另请参阅 overlap


contentData : list<QtObject> [default]

此属性存储内容数据列表。

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

注意:contentChildren不同,contentData还包括非可视的QML对象。当插入或移动项时,它不会被重新排序。

另请参阅 Item::datacontentChildren


contentModel : model [read-only]

此属性保存用于显示菜单项的模型。

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

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

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


count : int [只读,自 QtQuick.Controls 2.3 (Qt 5.10) 以来]

此属性包含项的数量。

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


currentIndex : int [自 QtQuick.Controls 2.3 (Qt 5.10) 以来]

此属性包含当前突出显示项的索引。

可以通过鼠标悬停或键盘导航来突出显示菜单项。

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

另见 MenuItem::highlighted.


delegate : Component [自 QtQuick.Controls 2.3 (Qt 5.10) 以来]

此属性包含用于创建要呈现动作的组件。

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

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

另见 Action.


focus : bool

此属性包含弹出窗口是否希望获取焦点。

当弹出窗口实际收到焦点时,activeFocus 将被设置为 true。有关更多信息,请参阅 Qt Quick 中的键盘焦点

默认值为 true

另见 activeFocus.


图标组

icon.cache : bool

icon.color : color

icon.height : int

icon.name : string

icon.source : url

icon.width : int

此属性组是在 QtQuick.Controls 6.5 中添加的。

名称描述
name此属性包含要使用的图标的名称。

图标将从平台主题中加载。如果主题中找到图标,它将始终使用;即使 icon.source 也已设置也是如此。如果没有找到图标,则将使用 icon.source

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

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

图标将以常规图像的形式加载。

如果 icon.name 已设置并引用了有效的主题图标,它将始终使用此属性。

width此属性包含图标的宽度。

图标的宽度永远不会超过此值,但如果需要,它将缩小。

height此属性包含图标的长度。

图标的长度永远不会超过此值,但如果需要,它将缩小。

color此属性包含图标的颜色。

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

cache此属性指定是否应缓存图标。

默认值为 true。

有关更多信息,请参阅 cache

此属性是在 QtQuick.Controls 2.13 中引入的。

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


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

此属性持有菜单水平重叠其父菜单像素的数量。

当将菜单用作级联子菜单时,此属性才有效。

默认值是样式特定的。

注意:切换菜单打开时的属性值没有效果。

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

另请参阅 cascade


title : string

此属性包含菜单的标题。

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


方法文档

在具有鼠标光标的桌面平台上,在鼠标光标处打开菜单,否则在其实例元素上方居中打开菜单。

菜单可以选择性地与特定菜单项对齐。

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

另请参阅 Popup::open()。


在弹出窗口坐标系统中,在指定位置 pos 打开菜单,即相对于其 parent 元素的坐标。

菜单可以选择性地与特定菜单项对齐。

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

另请参阅 Popup::open()。


在弹出窗口坐标系统中,在指定位置 xy 打开菜单,即相对于其 parent 元素的坐标。

菜单可以选择性地与特定菜单项对齐。

此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)中引入的。


[自 QtQuick.Controls 2.3 (Qt 5.10) 开始] void addAction(Action action)

action添加到菜单的末尾。

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


void addItem(Item item)

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


[自 QtQuick.Controls 2.3 (Qt 5.10) 开始] void addMenu(Menu menu)

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

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


[自 QtQuick.Controls 2.3 (Qt 5.10) 开始] void dismiss()

关闭此菜单所属的所有菜单。

注意:close()() 只关闭菜单及其子菜单不同,dismiss() 关闭整个菜单层次结构,包括父菜单。在实际应用中,close() 适用于实现菜单层次结构的导航,而 dismiss() 是关闭整个菜单层次结构的适当方法。

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

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


[自 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


[自 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从一个索引移动到另一个索引{i translate="no">to。


[自 QtQuick.Controls 2.3 (Qt 5.10) 开始] void removeAction(Action action)

删除并销毁指定的 action

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


[自 QtQuick.Controls 2.3 (Qt 5.10) 开始] void removeItem(Item item)

删除并销毁指定的 item

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


[自 QtQuick.Controls 2.3 (Qt 5.10) 开始] void removeMenu(Menu menu)

删除并销毁指定的菜单

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


[自 QtQuick.Controls 2.3 (Qt 5.10) 开始] Action takeAction(int index)

删除并返回索引位置为index的操作。该索引在菜单中的所有项内有效。

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

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


[自 QtQuick.Controls 2.3 (Qt 5.10) 开始] MenuItem takeItem(int index)

删除并返回索引位置为index的项。

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

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


[自 QtQuick.Controls 2.3 (Qt 5.10) 开始] Menu takeMenu(int index)

删除并返回索引位置为index的菜单。该索引在菜单中的所有项内有效。

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

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


© 2024 Qt 公司有限。此处包含的文档贡献归其各自所有者所有。提供的文档是根据由自由软件基金会发布的 GNU 自由文档许可证版本 1.3 条款许可的。Qt 及相应的标志是芬兰的 Qt 公司和其他世界上国家的注册商标。所有其他商标属于其各自所有者。