Представьте абстрактный тип как Q_PROPERTY для QML

Я использую Qt 4.8 с BB10.

Я определил базовый интерфейс для классов, чтобы реализовать:

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 не загружен или содержит ошибки, не может создать root

На самом деле, если я наведу курсор мыши на класс WebImageProcessor в редакторе, он скажет:

Супертип компонента WebImageProcessor неизвестен, некоторые его свойства не проверены.

Теперь дело в том, что, например, встроенный каскад ListView предоставляет абстрактный тип как Q_PROPERTY:

http://developer.blackberry.com/native/reference/cascades/bb_каскады_listview.html # свойство-DataModel

Событие, проверяющее заголовочные файлы bb :: cascades :: ListView и bb :: cascades :: DataModel, не дает мне никаких других подсказок, потому что это сделано по сути тем же способом.

Может быть, я должен зарегистрировать типы по-другому? Если так, как?

Если я использую WebImageProcessor в Q_PROPERTY вместо AbstractImageProcessor, тогда он работает, как и ожидалось, но я хочу выставить абстрактный тип, и учитывая, что каскады это делают, тогда это определенно возможно каким-то образом

Спасибо

5

Решение

В вашем объявлении AbstractImageProcessor отсутствует макрос Q_OBJECT, который необходим для экспорта класса в QtQuick.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]