qt - QML:如何为所有菜单添加阴影?

标签 qt qml qt5 qtquick2 qtquickcontrols2

我需要向应用程序中的所有菜单添加阴影。我知道如何向一个菜单添加阴影:

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.13
import QtGraphicalEffects 1.12

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

    Menu {
        id: contextMenu
        MenuItem {
            text: "Menu item 1"
        }
        MenuItem {
            text: "Menu item 2"
        }
        Menu {
            id: subMenu
            title: "Sub menu"
            MenuItem {
                text: "Sub menu item 1"
            }
            MenuItem {
                text: "Sub menu item 2"
            }
        }
    }

    DropShadow
    {
        width: contextMenu.width;
        height: contextMenu.height;
        x: contextMenu.x
        y: contextMenu.y
        visible: contextMenu.visible;

        source: contextMenu.background;

        horizontalOffset: 0;
        verticalOffset: 5;
        radius: 10;
        samples: 7;
        color: "black";
    }

    MouseArea {
        anchors.fill: parent
        acceptedButtons: Qt.RightButton
        onClicked: {
            contextMenu.popup()
        }
    }

}

但在这种情况下,阴影不会添加到子菜单中。另外,我不想为应用程序中的每个菜单重复 DropShadow。我想创建一个 MenuWithShadow 项并用它代替菜单项。

是否可以创建 MenuWithShadow 项目?如何创建它?

最佳答案

我能想到的最简单的方法是通过自定义菜单的背景项。这是一个带有发光效果的简单菜单:

假设我们有 MenuWithGlow 文件:

Menu{
    background: Rectangle {
        id: bgRectangle
        implicitWidth: 200
        implicitHeight: 40
        border.color: "black"

        layer.enabled: true
        layer.effect: DropShadow{
            width: bgRectangle.width
            height: bgRectangle.height
            x: bgRectangle.x
            y: bgRectangle.y
            visible: bgRectangle.visible

            source: bgRectangle

            horizontalOffset: 0
            verticalOffset: 5
            radius: 10
            samples: 7
            color: "#000000"
        }
    }
}

关于qt - QML:如何为所有菜单添加阴影?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59638929/

相关文章:

c++ - 在QDeclarativeView中使用QDeclarativeContext层次结构

c++ - 如何使 QFileDialog 在 Qt5 中不是模态的?

c++ - Qt5.2 NetworkManager::networkInterfaces()

c++ - 如何使用 QDataStream 在文件中写入和读取 QList<Mat>?

c++ - 使用 MXE gcc 构建 Qt 应用程序时缺少 std::mutex

opengl - QML:文本渲染问题

c++ - 模块项中的 QQmlComponent

c++ - 如何从函数传递 QStandardItemModel?

c++ - 翻译枚举值 Qt 的字符串表示形式

opencv - libgcc_s_dw2-1.dll丢失,使得OpenCV和Qt 5程序无法启动