将 TextStyle 从 c++ 传递到 QML

Posted

技术标签:

【中文标题】将 TextStyle 从 c++ 传递到 QML【英文标题】:Pass TextStyle from c++ to QML 【发布时间】:2014-05-27 12:08:03 【问题描述】:

我在使用 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对象传递给方法?

【问题讨论】:

【参考方案1】:

读完documentation on text styles我建议你试试这样的:

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

【讨论】:

这也许行得通,但它违背了目的。整个目的是避免在 qml 中有大量 TextStyleDefinitions,而是用标签的单行替换它们。还要记住,C++ 代码本质上是创建一个 TextStyleDefinition 并返回与 myStyle.style 相同的内容 - 所以我不知道它为什么不起作用。【参考方案2】:

在浏览了各种 .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++ 设置 Label 的 Style.base 属性时,它需要一个 TextStyle 对象,但是当您从 QML 设置它时,它需要一个 QVariant。使用->property("style")我们可以得到QML期望的QVariant。

【讨论】:

以上是关于将 TextStyle 从 c++ 传递到 QML的主要内容,如果未能解决你的问题,请参考以下文章

将二进制数据从 QML 传递到 C++

如何将 QPixmap 从 C++ 模型传递到 QML?

将 QStandardItemModel 从 C++ 传递到 QtQuick / QML TableView 并显示它

QT怎样将一个结构体作为函数参数从C++传递到QML

将 QObject 指针从 QML 对象传递给 C++

如何检索 QML 相机提要并发送到 C++ 后端