QML: как получить назначенный системой цвет текста TextField во время выполнения - PullRequest
0 голосов
/ 11 января 2020

У меня есть настольное Python приложение с простым пользовательским интерфейсом QML (PyQt5 и QtQuick 2.2). Он работает на Linux / KDE.

Без назначения указанных c цветов таким элементам, как Label и TextField, KDE назначает соответствующие цвета на основе темы рабочего стола (например, Breeze Light или Beeeze Dark). Это хорошо работает почти для всех элементов приложения, и мне нравится простота этого подхода.

Однако я определил список с флажками для каждого элемента списка. Для этих элементов списка операционная система неправильно назначает цвет текста, как и для всех других элементов .

Как показано в приведенном ниже коде, для contentItem: Text я должен назначьте явный цвет или KDE по умолчанию для черного как для Breeze Light, так и для Breeze Dark.

Rectangle {
    Layout.row: 2
    Layout.column: 2
    id: comboBox
    width: 150;height: 400
    color: 'transparent'

    DelegateModel {
        id: visualModel
        model: ListModel {
                ListElement { name: "name1"; selected: false }
                ListElement { name: "name2"; selected: false }
        }

        groups: [
            DelegateModelGroup { name: "selected" }
        ]

        delegate: Item {
                            width: parent.width
                            implicitHeight: 34

                            function toggle() { control.toggle() }

                            M2.CheckDelegate {

                                id: control
                                anchors.fill: parent
                                text: model.name

                                highlighted: comboBox.highlightedIndex == index
                                checked: model.selected
                                onCheckedChanged: model.selected = checked,
                                model.selected = checked,
                                (checked) ? cb_user.text +=
                                model.name + ' ' : cb_user.text =
                                cb_user.text.replace
                                (model.name + ' ', '')
                                contentItem: Text {
                                    text: control.text
                                    font: control.font
                                    opacity: enabled ? 1.0 : 0.3
                                    color: 'white'
                                    elide: Text.ElideRight
                                    verticalAlignment: Text.AlignVCenter
                                }

                            }
                        }
    }

    ListView {
        anchors.fill: parent
        model: visualModel
    }
}

Моя цель - сделать это приложение очень простым. Я бы предпочел не использовать их. Поскольку все остальное «просто работает», я хотел бы знать, есть ли способ назначить цвет contentItem: Text на основе цвета других текстовых полей или надписей в приложении, для которых операционная система правильно назначает цвета для каждой темы.

Приложение имеет элемент, например, с id: title, и оно получает соответствующий цвет, когда цвет явно не определен в моем QML.

Но во время выполнения title.color не определено в соответствии с этим кодом:

ApplicationWindow {
    Component.onCompleted: {
            console.log( "title.color: " + title.color )
    }

Если бы я мог получить этот цвет во время выполнения и назначить его для моего неподходящего цвета текста, это могло бы быть моим решением.

Я надеюсь, что найдите способ автоматически назначить цвет, который операционная система назначает другому тексту.

1 Ответ

0 голосов
/ 11 января 2020

Я использовал следующее решение: SystemPalette .

Я добавил это в ApplicationWindow:

SystemPalette { id: myPalette; colorGroup: SystemPalette.Active }
property color system_text_color: myPalette.text

Затем я просто присвоил это свойство своему тексту:

color: system_text_color
...