如何在QML中隐藏菜单项

时间:2016-07-26 07:53:54

标签: qt qml qtquick2 qtquickcontrols2

我正在使用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

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

3 个答案:

答案 0 :(得分:3)

除了隐藏项目之外,将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()
        }
    }
}

这是因为菜单的高度取决于内部contentHeight的{​​{1}}。

答案 1 :(得分:0)

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

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)
        }
    }
}

答案 2 :(得分:0)

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

但无法保证此私有方法。