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

Handle and trigger events from QML to C++ and viceversa

我正在使用 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 时。这可能吗?,你能给我看一个简单而实用的例子吗?

谢谢!

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

#include <QQuickItem>
例如,

QQuickItem 只是 QQuickView 的 header 中的 forward-declared,因此您不能依赖它包含 QQuickItem你,无论如何都不应该。

此外,关于 moc 不能与 main.cpp 中定义的 classes 一起工作的评论是错误的;你只需要在你的 class 定义之后包含 main.moc 就可以让 QObject 工作:

#include "main.moc"

我不喜欢这个神话,因为它把简短的片段和示例变成了三个文件,而它们本来可以只包含在一个文件中,这在 Stack Overflow、bug 跟踪器等方面更有用。:)