首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用上下文属性将C++对象嵌入到QML中

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

Ask Ubuntu用户
提问于 2014-03-08 16:09:49
回答 1查看 5.4K关注 0票数 5

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

C++

代码语言:javascript
复制
class MyClass : public QObject
{
    Q_OBJECT

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

public:
    MyClass()
    {
        qDebug() << Q_FUNC_INFO;
    }
};

我的main.cpp包含:

代码语言:javascript
复制
MyClass myClass;
QQmlEngine engine;
engine.rootContext()->setContextProperty( "myclass", &myClass );
QQmlComponent component( &engine, QUrl::fromLocalFile("qml/qtquick-01/main.qml") );
component.create();

QML

代码语言:javascript
复制
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();
        }
    }
}

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

ReferenceError: myclass未定义

知道我做错了什么吗?

EN

回答 1

Ask Ubuntu用户

回答已采纳

发布于 2014-03-08 19:25:34

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

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

项目文件: test.pro

代码语言:javascript
复制
# 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

myclass.h:

代码语言:javascript
复制
#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;
    }
};

main.cpp:

代码语言:javascript
复制
#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();
}

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

如果您使用QtCreator启动项目,您还将准备好使用qtquick2applicationviewer/文件夹。然后qmake && make && ./test将启动应用程序。如果单击text元素,您将得到:

代码语言:javascript
复制
MyClass::MyClass() 
void MyClass::doStuffFromQmlSlot()
票数 5
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/431368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档