如何在 QML 中使用助记字符串设置 MenuBarItem 的样式

How to style MenuBarItem with mnemonics strings in QML

我想在我的 Qt 应用程序中自定义 MenuBar(来自 QtQuick.Controls 2.4),所以我遵循了 Qt 网站(https://doc.qt.io/qt-5/qtquickcontrols2-customize.html#customizing-menubar)中的示例。

但是,该示例不包含助记符。这是我的具有助记符的 MenuBar 的代码:

import QtQuick 2.9
import QtQuick.Controls 2.4
import QtQuick.Layouts 1.11

import "../singletons"

MenuBar {    
    Menu {
        title: qsTr("&File")
        Action { text: qsTr("&Open...") }
        Action { text: qsTr("&Save") }
        Action { text: qsTr("Save &As...") }
        MenuSeparator { }
        Action { text: qsTr("&Quit") }
    }
    Menu {
        title: qsTr("&Edit")
        Action { text: qsTr("Cu&t") }
        Action { text: qsTr("&Copy") }
        Action { text: qsTr("&Paste") }
    }
    Menu {
        title: qsTr("&Help")
        Action { text: qsTr("&About") }
    }

    background: Rectangle {
        color: Style._ColorPrimaryDark
    }

    delegate: MenuBarItem {
        id: menuBarItem

        contentItem: Text {
            text: menuBarItem.text
            opacity: enabled ? 1.0 : 0.3
            color: "white"
            verticalAlignment: Text.AlignVCenter
        }
    }
}

当我 运行 代码时,菜单栏项看起来像这样(助记快捷方式仍然有效):

没有样式,MenuBar 项的助记字符按预期加下划线:

我找不到关于这个问题的任何信息。有什么方法或解决方法可以让我保留助记符并自定义外观吗?

看起来像一个错误。本机元素使用一些私有控件 IconLabel which isn't accessible ( see it here)。使用 Label 也不能解决问题。所以解决方案是避免项目自定义,或者使用一些像这样的愚蠢的解决方法:

delegate: MenuBarItem {
    id: menuBarItem

    function replaceText(txt)
    {
        var index = txt.indexOf("&");
        if(index >= 0)
            txt = txt.replace(txt.substr(index, 2), ("<u>" + txt.substr(index + 1, 1) +"</u>"));
        return txt;
    }

    contentItem: Label {
        text: replaceText(menuBarItem.text)
        color: "white"
        verticalAlignment: Text.AlignVCenter
        textFormat: Text.RichText
    }
}