【问题标题】:Expose abstract type as Q_PROPERTY to QML将抽象类型作为 Q_PROPERTY 公开给 QML
【发布时间】:2014-01-08 17:53:09
【问题描述】:

我正在使用带有 BB10 的 Qt 4.8。

我为要实现的类定义了一个基接口:

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")
--- 错误:(asset:///main.qml:138:57:无法将对象分配给属性) bb::cascades::QmlDocument:createRootObject 文档未加载或有错误,无法创建根

事实上,如果我将鼠标悬停在编辑器中的 WebImageProcessor 类上,它会显示:

组件WebImageProcessor的超类型未知,部分属性未验证。

现在的问题是,例如内置的级联 ListView 将抽象类型公开为 Q_PROPERTY:

http://developer.blackberry.com/native/reference/cascades/bb_cascades_listview.html#property-datamodel

检查 bb::cascades::ListView 和 bb::cascades::DataModel 的头文件的事件没有给我任何其他线索,因为它的完成方式基本相同。

可能是我必须以不同的方式注册类型吗?如果有怎么办?

如果我在 Q_PROPERTY 中使用 WebImageProcessor 而不是 AbstractImageProcessor 则它可以按预期工作,但我想公开抽象类型,并且考虑到级联可以做到这一点,那么它肯定是有可能的

谢谢

【问题讨论】:

  • 您的 AbstractImageProcessor 声明缺少 Q_OBJECT 宏。
  • @FrankOsterfeld 谢谢!我发誓我以前在那里有宏,但无论如何它都会失败,所以我最后不小心把它删除了。但我从头开始重建我的项目,添加宏后它现在可以工作了。
  • @FrankOsterfeld PS。你可能想复制答案,这样我就可以用积分奖励你:)

标签: c++ qt qml blackberry-10 qt4.8


【解决方案1】:

您的 AbstractImageProcessor 声明缺少 Q_OBJECT 宏,这是将类导出到 QtQuick 所必需的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多