处理和触发从QML到C ++的事件,反之亦然

时间:2015-01-30 14:47:08

标签: c++ qt events qml

我正在使用Qt,在Windows 8.1上使用最新版本的Qt Creator。一旦我完成了GUI,我就尝试用C ++来传达我的一些QML元素,反之亦然,即从双方发送数据。


示例我尝试过

我不知道该怎么做,然后我转发阅读本网站的官方文档和示例,但没有人适合我。

代码:

#include <QQmlApplicationEngine>
#include <QDebug>
#include <QObject>
#include <QGuiApplication>
#include <QQuickView>

class MyClass : public QObject
{
    Q_OBJECT
public slots:
    void cppSlot(const QString &msg) {
        qDebug() << "Called the C++ slot with message:" << msg;
    }
};

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

    QQuickView view(QUrl::fromLocalFile("MyItem.qml"));
    QObject *item = view.rootObject();

    MyClass myClass;
    QObject::connect(item, SIGNAL(qmlSignal(QString)),
                     &myClass, SLOT(cppSlot(QString)));

    view.show();
    return app.exec();
}

但是我收到了一个错误:

C:\Users\Tomi\qml\main.cpp:20: error: cannot convert 'QQuickItem*' to 'QObject*' in initialization
     QObject *item = view.rootObject();

我想要什么

我需要的是,当从QML按下按钮时,会请求某些数据到C ++,以及何时可以将它们发送到QML。这有可能吗?你能告诉我一个简单而实用的例子吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

错误是因为编译器不知道QQuickItem是什么。你需要包括它:

#include <QQuickItem>
例如,

QQuickItem仅在QQuickView标题中向前声明,因此您无法依赖它来为您添加QQuickItem,并且无论如何都不应该。

此外,关于moc不能使用main.cpp中定义的类的注释是错误的;你需要在你的类定义之后包含main.moc才能使QObject工作:

#include "main.moc"

我不喜欢这个神话,因为它将简短的片段和示例转换为三个文件,当它们只包含在一个文件中时,这在Stack Overflow,bug跟踪器等方面更有用:)