如何在 QML 中隐藏菜单项

Posted

技术标签:

【中文标题】如何在 QML 中隐藏菜单项【英文标题】:How to hide menu items in QML 【发布时间】:2016-07-26 07:53:54 【问题描述】:

我正在使用 Qt Quick Controls 2 并为上下文菜单编写以下代码:

Menu
    id: contextmenu
    x: ( parent.width - contextmenu.width ) / 2
    y: ( parent.height - contextmenu.height ) / 2
    modal: true

    property int selid

    MenuItem 
        text: "Compare"
        visible: isexp
    
    Divider visible: isexp 
    MenuItem 
        text: "Send..."
        visible: isexp
    
    Divider visible: isexp 
    MenuItem 
        text: "Edit..."
    
    Divider
    MenuItem 
        text: "Delete"
    

分频器 - 它是我的组件。 isexp 是对象的属性。 isexp false 菜单显示错误时。看截图: https://s31.postimg.org/c608kdtbv/qqq.png

如何更改菜单项的可见性并正确显示菜单。感谢您的建议。

【问题讨论】:

【参考方案1】:

除了隐藏项目之外,将height 设置为0 有效:

import QtQuick 2.6
import QtQuick.Controls 2.0

ApplicationWindow 
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    property bool itemsVisible: true

    Menu 
        id: contextmenu
        x: (parent.width - contextmenu.width) / 2
        y: (parent.height - contextmenu.height) / 2
        modal: true

        MenuItem 
            text: "Compare"
            visible: itemsVisible
            height: visible ? implicitHeight : 0
        
        MenuItem 
            text: "Send..."
            visible: itemsVisible
            height: visible ? implicitHeight : 0
        
        MenuItem 
            text: "Edit..."
        
        MenuItem 
            text: "Delete"
        
    

    Button 
        text: "Open"
        onClicked: 
            itemsVisible = !itemsVisible
            contextmenu.open()
        
    

这是因为菜单的高度基于内部ListViewcontentHeight

【讨论】:

禁用的项目仍然可见。我需要修改菜单。 我知道,这就是为什么我说我不认为这是一个受支持的用例。实际上,也许如果您也将高度设置为 0..【参考方案2】:

我找到了解决方法,但效果不太好:

Menu
    id: contextmenu
    x: ( parent.width - contextmenu.width ) / 2
    y: ( parent.height - contextmenu.height ) / 2
    modal: true

    MenuItem 
        text: "Compare"
    
    Divider 
    MenuItem 
        text: "Send..."
    
    Divider 

    MenuItem 
        text: "Edit..."
    
    Divider
    MenuItem 
        text: "Delete"
    

    Component.onCompleted: 
        if( !isexp )
        
            contextmenu.removeItem(0)
            contextmenu.removeItem(0)
            contextmenu.removeItem(0)
            contextmenu.removeItem(0)
        
    

【讨论】:

【参考方案3】:

在早期的 Qt 快速版本中,如 Controls 1.4,您可以使用菜单对象的私有方法:__closeAndDestroy()

但不能保证这个私有方法。

【讨论】:

以上是关于如何在 QML 中隐藏菜单项的主要内容,如果未能解决你的问题,请参考以下文章

如何在 BottomNavigationView 中动态隐藏菜单项?

如何在 Qt QML 中处理 mac 集成 About MenuBar 项?

如何在 Android 中显示和隐藏菜单项?

如何在 QMenu 中隐藏子菜单

如何在 QML 中隐藏光标

QML:在派生类中使属性只读