C++ QQuickWindow上下文属性?
我正在通过以下代码创建一个新窗口:C++ QQuickWindow上下文属性?,c++,qt,window,qml,C++,Qt,Window,Qml,我正在通过以下代码创建一个新窗口: QMainController* myController = new QMainController(0,m_autenticado); QQmlApplicationEngine* engine = new QQmlApplicationEngine(this); engine->rootContext()->setContextProperty("MyController", myController); engine-
QMainController* myController = new QMainController(0,m_autenticado);
QQmlApplicationEngine* engine = new QQmlApplicationEngine(this);
engine->rootContext()->setContextProperty("MyController", myController);
engine->load(QUrl(QStringLiteral("qrc:///newPage.qml")));
QQuickWindow* window = qobject_cast<QQuickWindow*>(engine->rootObjects().at(0));
window->showFullScreen();
但我收到了以下信息:
“QQuickView仅支持加载从QQuickItem派生的根对象
如果您的示例使用的是QML2(例如qmlscene)和.QML文件
加载了“导入QtQuick 1.0”或“导入Qt 4.7”,将发生此错误
要加载带有“导入QtQuick 1.0”或“导入Qt 4.7”的文件,请使用
Qt Quick 1模块中的QdeCrativeView类。“
QQuickWindow
不拥有自己的任何上下文属性,因此无法使用它设置上下文属性
正如消息所解释的,QQuickView
需要一个从QQuickItem
继承的QML根对象,这意味着根可以是一个矩形
,项
等,但不能是应用程序窗口
或窗口
,因为它们不是从QQuickItem
继承的。如果您可以将根对象更改为类似于Rectangle
,则可以创建QQuickView
的不同实例以实现您的目标,因为如果您不向每个QQuickView
提供现有的qqqmlengine
,则每个QQmlEngine都会创建自己的qqqmlengine
QQmlApplicationEngine
实际上继承自qqqmlengine
,因此每个实例都有自己的根上下文。例如,两次调用以下createMain()
将创建两个具有单独引擎、单独控制器和单独根上下文的窗口:
void foo::createMain() {
//TODO: Set a proper parent to myController
QMainController* myController = new QMainController(0,m_autenticado);
QQmlApplicationEngine* engine = new QQmlApplicationEngine(this);
engine->rootContext()->setContextProperty("MyController", myController);
engine->load(QUrl(QStringLiteral("qrc:///newPage.qml")));
QQuickWindow* window = qobject_cast<QQuickWindow*>(engine->rootObjects().at(0));
window->showFullScreen();
}
当然,如果没有使用QQmlApplicationEngine的功能,您可以将QQmlApplication
更改为QQmlEngine
。要修复错误消息,请将main.qml中的根项设为一个项或从中派生的项。我可能错了,但这感觉不对。我将丢失windows的信号和属性,不是吗?是的,但您将修复错误消息:P
void foo::createMain() {
//TODO: Set a proper parent to myController
QMainController* myController = new QMainController(0,m_autenticado);
QQmlApplicationEngine* engine = new QQmlApplicationEngine(this);
engine->rootContext()->setContextProperty("MyController", myController);
engine->load(QUrl(QStringLiteral("qrc:///newPage.qml")));
QQuickWindow* window = qobject_cast<QQuickWindow*>(engine->rootObjects().at(0));
window->showFullScreen();
}
// foo.h
class foo {
private:
QQmlApplicationEngine m_engine; // can change to QQmlEngine if you prefer
}
// foo.cpp
void foo::createMain()
{
//TODO: Set a proper parent to myController
QMainController* myController = new QMainController(0,m_autenticado);
// Create a new context as a child of m_engine.rootContext()
QQmlContext *childContext = new QQmlContext(&m_engine, &m_engine);
childContext->setContextProperty("MyController", myController);
QQmlComponent *component = new QQmlComponent(&m_engine, &m_engine);
component->loadUrl(QUrl("qrc:///qml/newPage.qml"));
// Create component in child context
QObject *o = component->create(childContext);
QQuickWindow* window = qobject_cast<QQuickWindow*>(o);
window->show();
}