【问题标题】:How to hide menu items in QML如何在 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

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

【问题讨论】:

    标签: qt qml qtquick2 qtquickcontrols2


    【解决方案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()

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-17
        • 2010-09-29
        • 1970-01-01
        • 2017-12-16
        • 2012-05-28
        • 1970-01-01
        相关资源
        最近更新 更多