Указание шрифта для многих текстовых элементов в Qt QML

у меня есть виджет, указанный через файл QML. Этот виджет содержит верхний уровеньRectangle, который содержит два Columns. Каждый из этих Columns содержит много Text-элементов. Этот виджет QML завернут в подкласс QDeclarativeView в C++.

Я хочу указать шрифт для каждого из них Text-элементов. Сегодня я делаю это, указав свойства верхнего уровня:

property string fontfamily: "Arial"
property bool fontbold: false
property bool fontitalic: false
property int fontpixelsize: 11
property string fontcolor: "White"

и обязать каждого Text-элементы к этим свойствам:

Text
{   
    color: fontcolor
    font.family: fontfamily
    font.bold: fontbold
    font.italic: fontitalic
    font.pixelSize: fontpixelsize
    ...
}

этот не очень элегантно, и новые поля нужно добавлять каждый раз, когда мне нужна поддержка чего-то нового (например, подчеркнутые шрифты). Я не смог объявить свойство типа font и привязать к этому вместо этого (виджет пуст, и qmlviewer предупреждает о "ожидаемом типе после свойства").

есть ли лучший способ указать шрифт для всех Text-элементы?

внимание! Я пишу файлы QML от руки.

3 ответов


еще одна возможность-написать новый компонент QML, который наследуется от Text an устанавливает некоторые свойства по умолчанию:

StyledText.в QML

import QtQuick 1.0

Text {
    // set default values
    color: "blue"
    font.family: "Arial"
    font.bold: true
    font.italic: true
    font.pixelSize: 12
}

main.в QML

import QtQuick 1.0

Rectangle {
    Row {
        spacing: 10

        Column {
            StyledText {
                text: "Foo1"
            }
            StyledText {
                text: "Bar1"
            }
            StyledText {
                text: "Baz1"
            }
        }

        Column {
            StyledText {
                text: "Foo2"
            }
            StyledText {
                text: "Bar2"
            }
            StyledText {
                text: "Baz2"
            }
        }
    }
}

в Qt 5.6 (по крайней мере, вероятно, и раньше), вы можете использовать Qt.font() динамически выделить объект шрифта и ссылаться на него в другом месте. Итак, это работает:

property font myFont: Qt.font({
    family: fontfamily,
    bold: fontbold,
    italic: fontitalic,
    pixelSize: fontpixelsize
});

Text
{   
    color: fontcolor
    font: parent.myFont
}

подробнее о Qt.font() здесь:https://doc-snapshots.qt.io/qt5-5.6/qml-qtqml-qt.html#font-method


одним из возможных решений является запись функции, которая повторяет children переданного элемента (например, a Column). В этой функции можно задать все свойства:

import QtQuick 1.0

    Rectangle {
    Row {
        spacing: 10

        Column {
            id: col1

            Text {
                property bool useStyle: true
                text: "Foo1"
            }
            Text {
                property bool useStyle: true
                text: "Bar1"
            }
            Text {
                property bool useStyle: true
                text: "Baz1"
            }
        }

        Column {
            id: col2

            Text {
                property bool useStyle: true
                text: "Foo2"
            }
            Text {
                text: "not styled"
            }
            Text {
                property bool useStyle: true
                text: "Baz2"
            }
        }
    }

    function setTextStyle(parentElement) {
        for (var i = 0; i < parentElement.children.length; ++i) {
            console.log("t", typeof parentElement.children[i]);
            if (parentElement.children[i].useStyle) {  // apply style?
                parentElement.children[i].color = "blue";
                parentElement.children[i].font.family = "Arial"
                parentElement.children[i].font.bold = true;
                parentElement.children[i].font.italic = true;
                parentElement.children[i].font.pixelSize = 12;
            }
        }
    }

    // set style
    Component.onCompleted: {
        setTextStyle(col1);
        setTextStyle(col2);
    }
}

каждый элемент, содержащий свойство useStyle что находится в true, получает стиле. Это короче, чем назначение стиля вручную, но вы все равно можете определить, какие элементы должны быть стилизованы или нет.