Как стилизовать MenuBarItem со строками мнемоники в QML - PullRequest
0 голосов
/ 17 февраля 2019

Я хочу настроить MenuBar (из QtQuick.Controls 2.4) в моем приложении Qt, поэтому я последовал примеру с веб-сайта 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 выглядят так (хотя мнемонические комбинации по-прежнему работают):

MenuBarItems have ampersands

Без стиля элементы MenuBar имеют мнемонический символ, подчеркнутый, как и ожидалось:

MenuBarItems have underlined mnemonics

Я не смог найти ничего об этой проблеме. Есть ли способ или обходной путь такЯ мог бы сохранить мнемонику и настроить внешний вид?

1 Ответ

0 голосов
/ 17 февраля 2019

Похоже, ошибка.В нативном элементе используется частный элемент управления IconLabel , который недоступен (см. Здесь здесь ).Использование 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
    }
}
...