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++ 插槽的主要内容,如果未能解决你的问题,请参考以下文章
如何从 C++ 端连接到 QML 项目的 onClick 事件
Qt Qml连接到Context属性的QObject属性的信号