Я использую 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:
Событие, проверяющее заголовочные файлы bb :: cascades :: ListView и bb :: cascades :: DataModel, не дает мне никаких других подсказок, потому что это сделано по сути тем же способом.
Может быть, я должен зарегистрировать типы по-другому? Если так, как?
Если я использую WebImageProcessor в Q_PROPERTY вместо AbstractImageProcessor, тогда он работает, как и ожидалось, но я хочу выставить абстрактный тип, и учитывая, что каскады это делают, тогда это определенно возможно каким-то образом
Спасибо
В вашем объявлении AbstractImageProcessor отсутствует макрос Q_OBJECT, который необходим для экспорта класса в QtQuick.
Других решений пока нет …