我编写了一个模型,将其与QML一起使用并正确定义了所有属性:
class Model: public QObject {
Q_OBJECT
Q_PROPERTY(QString title READ title CONSTANT)
Q_PROPERTY(QString request READ request CONSTANT)
Q_PROPERTY(int first READ first WRITE setFirst NOTIFY firstChanged)
Q_PROPERTY(int second READ second WRITE setSecond NOTIFY secondChanged)
Q_PROPERTY(int minimumValue READ minimumValue CONSTANT)
Q_PROPERTY(int maximumValue READ maximumValue CONSTANT)
Q_PROPERTY(bool isRange READ isRange CONSTANT)
Q_PROPERTY(int result READ result WRITE setResult)
... setters / getters / signals ...
}
然后我为一个使用以前的模型创建QML Dialog的对象编写了代码:
RangeInputDialog::Result RangeInputDialog::exec() const {
QQmlEngine engine;
QQmlComponent component(&engine);
component.loadUrl(QUrl("qrc:///ui-common/ui/RangeInputDialog.qml"));
if (!component.isReady()) {
qDebug() << "Could not load range input dialog";
qDebug() << component.errors();
return Result::Error;
}
QQmlContext context(&engine);
context.setContextProperty("rangeDialogModel", &m_model);
QScopedPointer<QObject> window(component.create(&context));
if (window.isNull()) {
qDebug() << "Could not instance range input dialog";
return Result::Error;
}
QEventLoop loop;
QObject::connect(window.data(), SIGNAL(closing(QQuickCloseEvent *)), &loop, SLOT(quit()));
if (window->setProperty("visible", true)) {
loop.exec();
} else {
qDebug() << "Could not show range input dialog";
return Result::Error;
}
return static_cast<Result>(m_model.result());
}
setContextProperty
将Model与QML Dialog绑定,在创建组件后,它会抛出一堆错误:
qrc:///ui-common/ui/RangeInputDialog.qml:23:9: Unable to assign [undefined] to QString
qrc:///ui-common/ui/RangeInputDialog.qml:39:10: Unable to assign [undefined] to QString
qrc:///ui-common/ui/RangeInputDialog.qml:58:19: Unable to assign [undefined] to double
qrc:///ui-common/ui/RangeInputDialog.qml:57:19: Unable to assign [undefined] to double
qrc:///ui-common/ui/RangeInputDialog.qml:56:12: Unable to assign [undefined] to double
qrc:///ui-common/ui/RangeInputDialog.qml:70:14: Unable to assign [undefined] to bool
qrc:///ui-common/ui/RangeInputDialog.qml:68:19: Unable to assign [undefined] to double
qrc:///ui-common/ui/RangeInputDialog.qml:67:12: Unable to assign [undefined] to double
有谁知道这个问题。 我尝试在清晰的解决方案中使用相同的代码,然后它运行良好。
解决方案
好的,我不知道为什么编译器没有抛出任何警告,但在const
方法中删除exec
说明符解决了这个问题。
答案 0 :(得分:2)
当您加载RangeInputDialog.qml文件时,它会尝试访问QQmlContext context(&engine);
上下文属性但它尚未存在,从而导致这些未定义的警告。
此外,当您执行setContextProperty
时,您正在创建新上下文,而不是检索用于创建组件的上下文。
您应该通过调用engine.getRootContext()
然后在该上下文上调用context.setContextProperty()
来获取它,以便您的组件可以访问上下文属性。
你应该component.loadUrl()
在{{1}}之前。
作为旁注:不是QML中的所有用户界面吗?从c ++显示QML对话框对我来说似乎很奇怪。 c ++业务层不应该知道QML UI层。