从QML调用C ++方法(Qt快速应用程序)

时间:2012-12-11 07:48:45

标签: c++ qt qt-quick

所以,我已经做了一些搜索,我读过的类似问题都没有提出过有效的建议。

我正在使用Qt Creator(我对Qt不太熟悉)所以我不确定它在后台做了什么伏都教。但是,我正在使用标准的Qt Quick Application项目。

本质上,我想从QML调用一个C ++函数,它返回一个字符串,定期替换布局中的某些文本。

这是main.cpp:

#include <QtGui/QApplication>
#include "qmlapplicationviewer.h"
#include <QDeclarativeContext>


class testClass : public QObject
{
    Q_OBJECT
public:
    Q_INVOKABLE QString gimmeText() {
            return QString("new text");
}
};



Q_DECL_EXPORT int main(int argc, char *argv[])
{
    QScopedPointer<QApplication> app(createApplication(argc, argv));

    QmlApplicationViewer viewer;

    viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto);
    viewer.setMainQmlFile(QLatin1String("qml/Picenter2/main.qml"));

    testClass t;
    viewer.rootContext()->setContextProperty("testOb", &t);

    viewer.showFullScreen();

    return app->exec();
}

以下是布局的片段(因为大部分内容显然无关紧要):

Text {
    id: text1
    x: 105
    y: 156
    color: "#ffffff"
    text: qsTr("text")
    font.pixelSize: 12
    Timer {
        interval: 1000; running: true; repeat: false
        onTriggered: text1.text = testOb.gimmeText();
    }

给出的错误是:

invalid use of incomplete type 'struct QDeclarativeContext' main.cpp (28)
forward declaration of 'struct QDeclarativeContext' qdeclarativeview.h (60)

编辑:包含QDeclarativeContext,上面的内容消失了,给出了这些错误:

(.text.startup+0x3e):-1: error: undefined reference to `vtable for testClass'
(.text.startup+0xcf):-1: error: undefined reference to `vtable for testClass'
(.text.startup+0x12b):-1: error: undefined reference to `vtable for testClass'
:-1: error: collect2: ld returned 1 exit status

我没有做太多的C ++编程,所以我并不完全熟悉这意味着什么。以下针对基本相同问题的建议只给了我错误或更难以理解的事情。

让我感到困惑的是,查看头文件时,QmlApplicationViewer派生自QDeclarativeView,这正是Qt文档使用here几乎完全按照我想要的方式执行的操作。感谢任何人的建议。

2 个答案:

答案 0 :(得分:5)

您必须注册您的课程才能将其与QML一起使用。您可以在main函数中执行此操作。您还必须在QML代码中导入它。您的代码应如下所示:

main.cpp:

#include <QtGui/QApplication>
#include "qmlapplicationviewer.h"
#include <QDeclarativeContext>

#include <QtDeclarative>    // Required for registration


class testClass : public QObject
{
    Q_OBJECT
    public:
    Q_INVOKABLE QString gimmeText() {
            return QString("new text");
    }
};



Q_DECL_EXPORT int main(int argc, char *argv[])
{
    QScopedPointer<QApplication> app(createApplication(argc, argv));

    qmlRegisterType<testClass>("MyCustomQMLObjects", 2, 35, "testClassNameInQML");

    QmlApplicationViewer viewer;

    viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto);
    viewer.setMainQmlFile(QLatin1String("qml/Picenter2/main.qml"));

    testClass t;
    viewer.rootContext()->setContextProperty("testOb", &t);

    viewer.showFullScreen();

    return app->exec();
}

QML代码:

// ...

import MyCustomQMLObjects 2.35

// ...

property testClassNameInQML testOb

// ...

Text {
    id: text1
    x: 105
    y: 156
    color: "#ffffff"
    text: qsTr("text")
    font.pixelSize: 12
    Timer {
        interval: 1000; running: true; repeat: false
        onTriggered: text1.text = testOb.gimmeText();
    }

// ...

答案 1 :(得分:0)

我没有使用qt的经验,我无法看到代码中的内容会触发错误。但是,当发生此类错误时,这是​​因为类(struct QDeclarativeContext)已经向前声明,但被用作好像整个定义已知(访问成员,声明变量)这种类型等)。要解决此问题,您需要包含具有此类型定义的标题