gpt4 book ai didi

c++ - 无法从 Qt C++ 将发出的信号捕捉到 QML 中

转载 作者:搜寻专家 更新时间:2023-10-31 02:08:41 24 4
gpt4 key购买 nike

我正在用 C++ 学习 Qt。

最近我尝试从 C++ 发出信号,并根据此事件更改尝试更新 QML 中的某些内容。 emit 不工作。事实上,调试代码告诉我,emit 之上和 emit 之后的代码行已经起作用。但是 emit 本身不起作用。

根据我目前的理解,你从 C++ 中发出一个信号,并且 on+signal nameQML 中使用 访问该事件。

我在这里做错了什么?

这是问题的简化版本:

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:emitSignalEmitSignal 对象不同于 >em 对象(除非该类实现单例,但在您的情况下它不是),即使为对象 em 发出信号也不会为具有 id:emitSignal 的项目发出>.

如果你想让它们成为同一个对象你必须使用setContextProperty并与 Connections 建立联系,也不应在加载 QML 窗口之前调用发出信号的方法。

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

ma​​in.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 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47238230/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com