Я использую 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:
Событие проверки файлов заголовка бб :: Каскады :: ListView и бб :: cascades :: DataModel не дает мне никаких других подсказок, потому что это делается практически так же.
Возможно ли, что я должен зарегистрировать типы по-другому? Если да, то как?
Если я использую WebImageProcessor в Q_PROPERTY вместо AbstractImageProcessor то он работает, как ожидалось, но я хочу, чтобы выставить абстрактный тип, и учитывая, что каскады это делает, то это, безусловно, можно как-то
Благодаря
В объявлении AbstractImageProcessor отсутствует макрос Q_OBJECT. –
@FrankOsterfeld Спасибо! Клянусь, у меня там был макрос, но он все равно не сработает, поэтому я, в конце концов, случайно удалил его. Но я перестроил свой проект с нуля, и теперь он работает после добавления макроса. – krdx
@FrankOsterfeld PS. Вы можете скопировать ответ, чтобы я мог вознаградить вас очками :) – krdx