2013-12-19 2 views
5

Я использую Qt 4.8 с BB10.Выставить абстрактный тип как Q_PROPERTY в QML

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

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.

бб :: каскады :: QmlDocument: Ошибка при загрузке QML из: QUrl ("актива: ///main.qml")
--- ошибки: (актив: ///main.qml: 138 : 57: Невозможно присвоить объект недвижимости) бб :: каскады :: QmlDocument: createRootObject документ не загружен или содержит ошибки, не может создать Root

в самом деле, если я парить над классом WebImageProcessor в редакторе, он говорит:

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

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

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

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

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

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

Благодаря

+0

В объявлении AbstractImageProcessor отсутствует макрос Q_OBJECT. –

+0

@FrankOsterfeld Спасибо! Клянусь, у меня там был макрос, но он все равно не сработает, поэтому я, в конце концов, случайно удалил его. Но я перестроил свой проект с нуля, и теперь он работает после добавления макроса. – krdx

+0

@FrankOsterfeld PS. Вы можете скопировать ответ, чтобы я мог вознаградить вас очками :) – krdx

ответ

3

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

Смежные вопросы