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

问题描述 投票:0回答:1

我想在我的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项看起来像这样(助记符快捷键仍然有效):

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

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

qt qml qtquick2 qtquickcontrols2
1个回答
3
投票

看起来像个bug。本机元素使用一些无法访问的私有控件IconLabel(请参阅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
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.