krd*_*rdx 6 c++ qt qml qt4.8 blackberry-10
我正在使用Qt 4.8和BB10.
我为要实现的类定义了一个基本接口:
class AbstractImageProcessor : public QObject
{
public:
AbstractImageProcessor(QObject * parent) : QObject(parent) {}
virtual QImage process(const QByteArray &data) = 0;
virtual ~AbstractImageProcessor(){ }
};
Run Code Online (Sandbox Code Playgroud)
我希望从QML中使用的一个这样的实现看起来像这样:
class WebImageProcessor : public AbstractImageProcessor
{
Q_OBJECT
Q_PROPERTY(int maxHeight READ getMaxHeight WRITE setMaxHeight NOTIFY maxHeightChanged)
Q_PROPERTY(int maxWidth READ getMaxWidth WRITE setMaxWidth NOTIFY maxWidthChanged)
Q_PROPERTY(bool fit READ isFit NOTIFY fitChanged)
public WebImageProcessor(QObject * parent = 0) : AbstractImageProcessor(parent) {}
virtual ~WebImageProcessor() {}
/* rest of code omitted */
};
Run Code Online (Sandbox Code Playgroud)
我想将此AbstractImageProcessor作为另一个QML类型的属性公开:
class WebImageView : public bb::cascades::ImageView {
Q_OBJECT
Q_PROPERTY(AbstractImageProcessor* processor READ getProcessor WRITE setProcessor NOTIFY processorChanged)
WebImageView(bb::cascades::Container * parent) : bb::cascades::ImageView(parent) {}
virtual WebImageView() {}
/* rest of code omitted */
};
Run Code Online (Sandbox Code Playgroud)
所以我用QML注册我的自定义类型
//application.cpp
qmlRegisterUncreatableType<AbstractImageProcessor>("foo.controls", 1, 0, "AbstractImageProcessor", ""); ;
qmlRegisterType<WebImageProcessor>("foo.controls", 1, 0, "WebImageProcessor");
qmlRegisterType<WebImageView>("foo.controls", 1, 0, "WebImageView");
Run Code Online (Sandbox Code Playgroud)
我想如何在QML中使用它
//main.qml
import foo.controls 1.0
/* omitted containers */
WebImageView {
processor: WebImageProcessor {
maxHeight: 500
maxWidth: 300
}
/* rest of properties omitted */
}
Run Code Online (Sandbox Code Playgroud)
但是一旦我启动我的应用程序,它就无法解析qml文档.
bb :: cascades :: QmlDocument:从以下位置加载QML时出错:QUrl("asset:///main.qml")
--- errors:(asset:///main.qml:138:57:无法将对象分配给property)bb :: cascades :: QmlDocument:createRootObject文件未加载或有错误,无法创建root
事实上,如果我将鼠标悬停在编辑器中的WebImageProcessor类上,它会说:
组件WebImageProcessor的超类型未知,其某些属性未经过验证.
现在的问题是,例如内置的级联ListView将抽象类型公开为Q_PROPERTY:
检查bb :: cascades :: ListView和bb :: cascades :: DataModel的头文件的事件没有给我任何其他线索,因为它基本上以相同的方式完成.
难道我必须以不同的方式注册类型吗?如果是这样的话?
如果我在Q_PROPERTY而不是AbstractImageProcessor中使用WebImageProcessor,那么它按预期工作,但我想暴露抽象类型,并且鉴于级联执行它然后它绝对可能以某种方式
谢谢