将 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的主要内容,如果未能解决你的问题,请参考以下文章