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

Posted

技术标签:

【中文标题】如何在 QML 中使用助记符字符串设置 MenuBarItem 的样式【英文标题】:How to style MenuBarItem with mnemonics strings in QML 【发布时间】:2019-02-17 18:39:03 【问题描述】:

我想在我的 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 项目的助记符按预期加下划线:

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

【问题讨论】:

【参考方案1】:

看起来像一个错误。本机元素使用一些无法访问的私有控件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
    

【讨论】:

这个错误是报告了还是我应该报告?无论如何,感谢您的解决方法。

以上是关于如何在 QML 中使用助记符字符串设置 MenuBarItem 的样式的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QML 中从 QString 格式化日期

如何将 QML 插件设置为 Loader 的源

如何在QML中使用按钮,GroupBox,文本和ProgressBar设置基本的GridLayout

如何将C ++类设置为qml中的Item?

如何使用 .qml 页面设置容器内容?

如何在QML中使用不同的字体