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();
}