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

C++ and QML: Connect QML Signal to C++ Slot

本文关键字:C++ QML 插槽 连接 信号      更新时间:2023-10-16

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

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

找不到合适的对象?这里有相关的代码文件:

主.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
    }
}

第 1 页:

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();
        }
     }
}

因为您正在连接item(main.qml(而不是myObject

如果这样做,它将起作用:

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

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

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