Qml 如何使用C++;

Qml 如何使用C++;,qml,qt5,qtquick2,Qml,Qt5,Qtquick2,我有一个类main窗口作为不同视图的容器主窗口继承Qml元素窗口主窗口。qml是主qml文件。现在看起来是这样的: MainWindow.h: #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QQmlApplicationEngine> #include <string> #include "CustomMenu.h" class MainWindow : public QObject { Q_OBJEC

我有一个类
main窗口
作为不同视图的容器<代码>主窗口继承Qml元素
窗口
<代码>主窗口。qml是主qml文件。现在看起来是这样的:

MainWindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QQmlApplicationEngine>
#include <string>
#include "CustomMenu.h"

class MainWindow : public QObject
{
    Q_OBJECT
private:
    QQmlApplicationEngine engine_;
    QObject* content_;

public:
    MainWindow(QObject* parent = 0);
    Q_INVOKABLE void changeContent(std::string contentID);
};

#endif // MAINWINDOW_H
Main.cpp

#include <QGuiApplication>
#include "Gui/MainWindow.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    MainWindow* mainwindow = new MainWindow();

    return app.exec();
}
#include <QGuiApplication>
#include "Gui/MainWindow.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    MainWindow* mainwindow = new MainWindow();
    mainwindow->show();

    return app.exec();
}
MainWindow.qml

import QtQuick 2.3
import QtQuick.Window 2.2
import com.Gui 1.0

Window {
    visible: true
    id: main
    width: 1024
    height: 768
    property string contentID: "startMenu"
    property CustomMenu content: null
    property MainWindow mainWindowInstance

    MouseArea {
        anchors.fill: parent
        onClicked: {
            mainWindowInstance.changeContent("StartMenu")
        }
    }
}
Main.cpp

#include <QGuiApplication>
#include "Gui/MainWindow.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    MainWindow* mainwindow = new MainWindow();

    return app.exec();
}
#include <QGuiApplication>
#include "Gui/MainWindow.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    MainWindow* mainwindow = new MainWindow();
    mainwindow->show();

    return app.exec();
}
#包括
#包括“Gui/MainWindow.h”
int main(int argc,char*argv[])
{
QGUI应用程序应用程序(argc、argv);
MainWindow*MainWindow=新的MainWindow();
主窗口->显示();
返回app.exec();
}

您可以使用
qqqmlContext::setContextProperty()
导出已注册类型的实例

在我的应用程序中,我调用,例如:

qmlRegisterType<MyClass>("MyModule", 1, 0, "MyClass");

MyClass* mClassInstance = new MyClass;
mMainView->rootContext()->setContextProperty("classInstance", mClassInstance);
qmlRegisterType(“MyModule”,1,0,“MyClass”);
MyClass*mClassInstance=新建MyClass;
mMainView->rootContext()->setContextProperty(“classInstance”,mClassInstance);
导入
MyModule
后,现在我可以在QML world中访问
classInstance
。 我的
mMainView
此处继承自
QQuickView


我想你会明白的。

该方法不可用,因为你正在QML文件中使用
窗口。您应该使用注册的类型,即
main窗口
。这样就可以调用可调用的函数。也就是说,为什么要用这种方式来改变内容?无法通过使用
Loader
s或动态实例化等方式更改QML中的内容?@BaCaRoZzo我想我实际使用的是
MainWindow
,因为根QML文件名为
MainWindow.QML
,不是吗?我不知道加载程序,这非常有帮助,谢谢!调用文件
MainWindow.qml
与注册类型
MainWindow
的使用没有任何关系。实际上,您最终使用了一个上下文属性,它与注册类型完全不同。我想你会发现讨论新类型和上下文属性很有用。干杯。好了,现在我让这东西开始工作了,非常感谢!!
qmlRegisterType<MyClass>("MyModule", 1, 0, "MyClass");

MyClass* mClassInstance = new MyClass;
mMainView->rootContext()->setContextProperty("classInstance", mClassInstance);