【问题标题】:Pass TextStyle from c++ to QML将 TextStyle 从 c++ 传递到 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对象传递给方法?

【问题讨论】:

    标签: c++ qt qml blackberry-10


    【解决方案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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      • 2013-07-22
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多