使用上下文属性将 C++ 对象嵌入到 QML 中

ser*_*ico 5 c++ qml qt5 ubuntu-touch

根据 Qt5 文档:公开包括 qt 插槽在内的方法,所有从 QObject 继承的 C++ 类的公共插槽都可以从 QML 访问这里我做了什么:

C++

class MyClass : public QObject
{
    Q_OBJECT

public slots:
    void doStuffFromQmlSlot()
    {
        qDebug() << Q_FUNC_INFO;
    }

public:
    MyClass()
    {
        qDebug() << Q_FUNC_INFO;
    }
};
Run Code Online (Sandbox Code Playgroud)

我的main.cpp包含:

MyClass myClass;
QQmlEngine engine;
engine.rootContext()->setContextProperty( "myclass", &myClass );
QQmlComponent component( &engine, QUrl::fromLocalFile("qml/qtquick-01/main.qml") );
component.create();
Run Code Online (Sandbox Code Playgroud)

质量管理语言

import QtQuick 2.0

Rectangle {
    width: 360
    height: 360
    Text {
        text: qsTr("Hello World")
        anchors.centerIn: parent
    }
    MouseArea {
        anchors.fill: parent
        onClicked: {
            myclass.doStuffFromQmlSlot();

            Qt.quit();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

实际上,QtCreator 似乎将暴露的myclass对象识别到 QML 中,因为它可以自动完成类名 (myclass) 和公共插槽 doStuffFromQmlSlot()。当我运行应用程序时,我不幸收到以下错误:

参考错误:未定义 myclass

关于我做错了什么的任何线索?

Syl*_*eau 5

我重用了您的 qml 文件在 QtCreator 中启动了一个新项目。

请在下面找到我用来成功编译和使用该应用程序的文件:

项目文件:test.pro

# The .cpp file which was generated for your project. Feel free to hack it.
SOURCES += main.cpp

# Please do not modify the following two lines. Required for deployment.
include(qtquick2applicationviewer/qtquick2applicationviewer.pri)
qtcAddDeployment()

HEADERS += myclass.h
Run Code Online (Sandbox Code Playgroud)

我的类.h:

#include <QObject>
#include <qdebug.h>

class MyClass : public QObject
{
    Q_OBJECT

public slots:
    void doStuffFromQmlSlot()
    {
        qDebug() << Q_FUNC_INFO;
    }

public:
    MyClass()
    {
        qDebug() << Q_FUNC_INFO;
    }
};
Run Code Online (Sandbox Code Playgroud)

主.cpp:

#include <QtGui/QGuiApplication>
#include "qtquick2applicationviewer.h"
#include <QQmlContext>
#include "myclass.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    MyClass myClass;

    QtQuick2ApplicationViewer viewer;
    viewer.rootContext()->setContextProperty("myclass", &myClass);
    viewer.setMainQmlFile(QStringLiteral("qml/main.qml"));
    viewer.showExpanded();

    return app.exec();
}
Run Code Online (Sandbox Code Playgroud)

qml/main.qml正是您问题中提供的片段

如果您使用 QtCreator 启动项目,您还可以使用 qtquick2applicationviewer/ 文件夹。然后qmake && make && ./test将启动应用程序。如果您单击文本元素,您将获得:

MyClass::MyClass() 
void MyClass::doStuffFromQmlSlot()
Run Code Online (Sandbox Code Playgroud)