无法从 Qt C++ 将发出的信号捕捉到 QML 中
Not able to catch the emitted signal into the QML from Qt C++
我正在用 C++ 学习 Qt。
最近我尝试从 C++ 发出信号,并根据此事件更改尝试更新 QML
中的某些内容。 emit
不工作。事实上,调试代码告诉我 emit
上方和 emit
之后的代码行已经起作用。但是 emit
本身不工作。
根据我到目前为止的理解,您 emit
来自 C++ 的信号和 on
+signal name
在 QML
内部使用来访问该事件。
我做错了什么?
这里是问题的简化版本:
emitsignal.h
#ifndef EMITSIGNAL_H
#define EMITSIGNAL_H
#include <QObject>
class EmitSignal : public QObject
{
Q_OBJECT
public:
explicit EmitSignal(QObject *parent = nullptr);
int add(int, int);
signals:
void mySignal();
public slots:
};
#endif // EMITSIGNAL_H
emitsignal.cpp
#include "emitsignal.h"
#include <QDebug>
EmitSignal::EmitSignal(QObject *parent) : QObject(parent) {}
int EmitSignal::add(int x, int y)
{
int z = x + y;
qDebug() << z;
emit mySignal();
return x + y;
}
main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "emitsignal.h"
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
qmlRegisterType<EmitSignal>("com", 1, 0, "EmitSignal");
EmitSignal em;
em.add(1,2);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
}
main.qml
import QtQuick 2.8
import QtQuick.Window 2.2
import com 1.0
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
EmitSignal {
id: emitSignal
onMySignal: console.log('Inside the function')
}
}
当使用qmlRegisterType
时,类型正在被注册,所以带有id:emitSignal
的EmitSignal
对象不同于em
对象(除非class 实现了一个单例,但在你的情况下它不是),即使为对象 em 发出信号也不会为带有 id:emitSignal
.
的项目发出
如果您希望它们是同一个对象,您必须使用 setContextProperty
and make the connections with Connections
,并且您不应该在 QML
window 加载之前调用发出信号的方法。
main.cpp
#include "emitsignal.h"
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
EmitSignal em;
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("EmitSignal", &em); // EmitSignal is the id
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
em.add(1,2);
return app.exec();
}
main.qml
import QtQuick 2.8
import QtQuick.Window 2.2
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
Connections {
target: EmitSignal
onMySignal: console.log('Inside the function')
}
}
参考文献:
我正在用 C++ 学习 Qt。
最近我尝试从 C++ 发出信号,并根据此事件更改尝试更新 QML
中的某些内容。 emit
不工作。事实上,调试代码告诉我 emit
上方和 emit
之后的代码行已经起作用。但是 emit
本身不工作。
根据我到目前为止的理解,您 emit
来自 C++ 的信号和 on
+signal name
在 QML
内部使用来访问该事件。
我做错了什么?
这里是问题的简化版本:
emitsignal.h
#ifndef EMITSIGNAL_H
#define EMITSIGNAL_H
#include <QObject>
class EmitSignal : public QObject
{
Q_OBJECT
public:
explicit EmitSignal(QObject *parent = nullptr);
int add(int, int);
signals:
void mySignal();
public slots:
};
#endif // EMITSIGNAL_H
emitsignal.cpp
#include "emitsignal.h"
#include <QDebug>
EmitSignal::EmitSignal(QObject *parent) : QObject(parent) {}
int EmitSignal::add(int x, int y)
{
int z = x + y;
qDebug() << z;
emit mySignal();
return x + y;
}
main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "emitsignal.h"
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
qmlRegisterType<EmitSignal>("com", 1, 0, "EmitSignal");
EmitSignal em;
em.add(1,2);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
}
main.qml
import QtQuick 2.8
import QtQuick.Window 2.2
import com 1.0
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
EmitSignal {
id: emitSignal
onMySignal: console.log('Inside the function')
}
}
当使用qmlRegisterType
时,类型正在被注册,所以带有id:emitSignal
的EmitSignal
对象不同于em
对象(除非class 实现了一个单例,但在你的情况下它不是),即使为对象 em 发出信号也不会为带有 id:emitSignal
.
如果您希望它们是同一个对象,您必须使用 setContextProperty
and make the connections with Connections
,并且您不应该在 QML
window 加载之前调用发出信号的方法。
main.cpp
#include "emitsignal.h"
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
EmitSignal em;
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("EmitSignal", &em); // EmitSignal is the id
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
em.add(1,2);
return app.exec();
}
main.qml
import QtQuick 2.8
import QtQuick.Window 2.2
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
Connections {
target: EmitSignal
onMySignal: console.log('Inside the function')
}
}
参考文献: