我想在我的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项会按预期加下划线的助记符:
我找不到任何关于这个问题的信息。有没有办法或解决方法所以我可以保留助记符并自定义外观?
看起来像个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
}
}