C++ 和 QML:将 QML 信号连接到 C++ 插槽

Posted

技术标签:

【中文标题】C++ 和 QML:将 QML 信号连接到 C++ 插槽【英文标题】:C++ and QML: Connect QML Signal to C++ Slot 【发布时间】:2017-05-08 20:56:22 【问题描述】:

我无法使以下代码中的信号连接正常工作。我特别想通过将信号连接到 cpp 插槽而不设置上下文来做到这一点。我想问题在于

 item->findChild<QObject*>("signalItem");

没有找到正确的对象? 这里是相关的代码文件:

main.cpp:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "include/myclass.h"

int main(int argc, char *argv[])

    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QLatin1String("qrc:/main.qml")));
    QObject * item = engine.rootObjects().value(0);
    QObject * myObject= item->findChild<QObject*>("signalItem");
    MyClass myClass;
    QObject::connect(item, SIGNAL(testSignal()),&myClass,SLOT(cppSlot()));

    return app.exec();

main.qml:

import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.0

ApplicationWindow 
    visible: true
    width: 800
    height: 460

    Page1 
        id: page1
        visible: true
    

Page1.qml:

import QtQuick 2.7
import QtQuick.Window 2.2

Item 
    width: 800
    height: 460
    id: signalItem
    objectName: "signalItem"
    signal testSignal()

    CustomButton 
        id: cppSignalButton
        x: 14
        y: 55
        buttonText: "Test CPP Signal"
        onButtonClicked: 
            signalItem.testSignal();
        
     

【问题讨论】:

【参考方案1】:

因为你连接的是item(main.qml) 而不是myObject

如果你这样做,它会起作用:

QObject::connect(myObject, SIGNAL(testSignal()),&myClass,SLOT(cppSlot()));

实际上,您还应该添加检查该函数的返回值是否不为空:

QObject * item = engine.rootObjects().value(0);
QObject * myObject= item->findChild<QObject*>("signalItem");

【讨论】:

以上是关于C++ 和 QML:将 QML 信号连接到 C++ 插槽的主要内容,如果未能解决你的问题,请参考以下文章

将 qml 信号连接到 Qt

如何从 C++ 端连接到 QML 项目的 onClick 事件

Qt Qml连接到Context属性的QObject属性的信号

将 QML 信号连接到 PySide2 插槽

使用 PySide2 将 python 信号连接到 QML ui 插槽

QML 插槽中未收到 C++ 信号