我在 BB10 上使用 Qt 4.8。
我为要实现的类定义了一个基接口(interface):
class AbstractImageProcessor : public QObject
{
public:
AbstractImageProcessor(QObject * parent) : QObject(parent) {}
virtual QImage process(const QByteArray &data) = 0;
virtual ~AbstractImageProcessor(){ }
};
我希望从 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 */
};
我想将此 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 */
};
所以我用 QML 注册了我的自定义类型
//application.cpp
qmlRegisterUncreatableType<AbstractImageProcessor>("foo.controls", 1, 0, "AbstractImageProcessor", ""); ;
qmlRegisterType<WebImageProcessor>("foo.controls", 1, 0, "WebImageProcessor");
qmlRegisterType<WebImageView>("foo.controls", 1, 0, "WebImageView");
我想如何在 QML 中使用它
//main.qml
import foo.controls 1.0
/* omitted containers */
WebImageView {
processor: WebImageProcessor {
maxHeight: 500
maxWidth: 300
}
/* rest of properties omitted */
}
但是一旦我启动我的应用程序,它就无法解析 qml 文档。
bb::cascades::QmlDocument:从以下位置加载 QML 时出错:QUrl( "asset:///main.qml")
--- 错误:( Assets :///main.qml:138:57:无法将对象分配给属性)
bb::cascades::QmlDocument:createRootObject 文档未加载或有错误,无法创建根
事实上,如果我将鼠标悬停在编辑器中的 WebImageProcessor 类上,它会显示:
组件 WebImageProcessor 的父类(super class)型未知,它的某些属性未经过验证。
现在的问题是,例如内置级联 ListView 将抽象类型公开为 Q_PROPERTY:
检查 bb::cascades::ListView 和 bb::cascades::DataModel 的头文件的事件没有给我任何其他线索,因为它们的完成方式基本相同。
难道我必须以不同的方式注册类型吗?如果是怎么办?
如果我在 Q_PROPERTY 中使用 WebImageProcessor 而不是 AbstractImageProcessor 那么它会按预期工作,但我想公开抽象类型,并且考虑到级联这样做,那么它绝对有可能以某种方式
谢谢
最佳答案
您的 AbstractImageProcessor 声明缺少 Q_OBJECT 宏,这是将类导出到 QtQuick 所必需的。
关于c++ - 将抽象类型作为 Q_PROPERTY 公开给 QML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20693957/