将TextStyle从c++传递到QML

Pass TextStyle from c++ to QML

本文关键字:QML c++ TextStyle      更新时间:2023-10-16

我在使用c++方法设置标签的TextStyle时遇到问题,它总是导致应用程序崩溃。

我有一个c++的getStyle()方法。我希望能够像这样调用它(参数删除以简化代码示例):
Label {
    id: myLabel                        
    text: "test with style"
    textStyle.base: _App.getStyle();
}

TextStyle ApplicationUI::getStyle() {
    TextStyle *blueStyle = new TextStyle(bb::cascades::SystemDefaults::TextStyles::smallText());
    blueStyle->setColor(Color::Blue);
    return *blueStyle;
}

目前,我能够让它工作的唯一方法是将整个Label对象传递到一个方法中,并使用c++设置样式。然而,这使得QML代码更加冗长,导致如下:

Label {
    id: myLabel                        
    text: "test with style"
    onCreationCompleted: {
        _App.setStyle(myLabel);
    }
}
c++(作品)

void ApplicationUI::setStyle(AbstractTextControl* label) {
    TextStyle *blueStyle = new TextStyle(bb::cascades::SystemDefaults::TextStyles::smallText());
    blueStyle->setColor(Color::Blue);
    label->textStyle()->setBase(*blueStyle);
}

是否有任何方法可以将TextStyle直接传递给QML Label,而不必将Label对象传递给方法?

在阅读了关于文本样式的文档之后,我建议您尝试这样做:

Page {
    content: Container {
        attachedObjects: [
            TextStyleDefinition {
                id: myStyle
                base: _App.getStyle()
            }
        ]
        Label {
            text: "A label with some text."
            textStyle {
                base: myStyle.style
            }
        }
    } // end of Container
} // end of Page

在浏览了各种。h文件并进行了实验后,我设法解决了这个问题。

QML:

Label {
    id: myLabel                        
    text: "test with style"
    textStyle.base: _App.getStyle();
}
c++:

QVariant ApplicationUI::getStyle() {
    TextStyleDefinition *textStyle = new TextStyleDefinition();
    textStyle->setColor(Color::Blue);
    QVariant style = textStyle->property("style");
    return style;
}

的技巧是,当设置标签的样式。从c++的base属性,它需要一个TextStyle对象,但是当你从QML设置它时,它需要一个QVariant。使用->property("style"),我们可以得到QML期望的QVariant