4

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

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

4

3 回答 3

4

除了隐藏项目之外,将其设置为height0

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内部的ListView

于 2016-07-26T08:49:39.263 回答
-1

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

但是不能保证这种私有方法。

于 2017-04-20T09:44:30.237 回答
-1

我找到了解决方法,但它不是很好:

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)
        }
    }
}
于 2016-07-26T10:19:31.033 回答