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

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

谢谢!

最佳答案

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

#include <QQuickItem>
例如,

QQuickItem 仅在 QQuickView 的 header 中进行前向声明,因此您不能依赖它来包含 QQuickItem对你来说,无论如何都不应该。

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

#include "main.moc"

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

关于c++ - 处理和触发从 QML 到 C++ 的事件,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28238364/

相关文章:

c++ - 使用 g++ 编译,使用 vector 和数组库

c++ - 通过模板定义 main()

c++ - 重新连接 QTcpServer

c++ - QSocketnotifier 在 Windows 上不能用于串口读取?

objective-c - 对象-C : Why is my NSTextField subclass having an effect on objects I haven't assigned to it?

c# - 你如何找出在 C# 中订阅了一个事件的内容?

c++ - 在 for 循环中总结距离

c++ - 将 ascii 'maze' 读入二维数组

qt - 在 QScrollArea 的边缘绘画

c# - 确保事件最终发布到消息队列系统的最佳方式