gpt4 book ai didi

c++ - 如何在 C++ 代码的特定 QML 项的上下文中发出信号

转载 作者:行者123 更新时间:2023-12-01 14:44:53 26 4
gpt4 key购买 nike

我有两个具有相同接口(interface)(发出和处理的信号)和不同 objectName 的 QML 项属性值:

Text {
id: the_first_item
objectName: "the_first_item"

signal ping();

onPing: {
text = "pong! (variant 1)"
}
}

Text {
id: the_second_item
objectName: "the_second_item"

signal ping();

onPing: {
text = "pong! (variant 2)"
}
}

我想发出 ping在这些项目之一的上下文中发出信号。 在 QML 我会这样做:
Item {
onSomething: the_first_item.ping()
}

问题是 我想用 C++ 代码 .我有一个指向 QQuickItem 实例的指针使用 findChild 检索的类 objectName的方法和值属性(property)。

我发现的处理由 C++ 代码触发的信号的唯一解决方案是定义自己的 QObject派生,在其主体中声明一个信号方法,然后在此类实例的上下文中简单地调用它:
class SomeLogic : public QObject
{
public signals:
void ping();

public:
void doSth() { ping(); }
};

然后,在引擎的根上下文中放置一个指向此类实例的指针,并通过以下方式将处理程序连接到 QML 中的此信号:
Text {
id: the_first_item
//objectName: "the_first_item"

Connections {
target: the_instance_of_some_logic_property_name
onPing: {
text = "pong!"
}
}
}

但是如果我理解正确就不好了,因为如果 the_second_item以相同的方式定义,它们都将处理 ping the_instance_of_some_logic_property_name 发出的信号我只想触发其中一个。

现在,当我写它的时候,我认为可能在每个项目中提供一个实用函数,然后发出 ping在自己的上下文中发出信号,如下所示:
Text {
id: the_first_item
objectName: "the_first_item"

signal ping();

onPing: {
text = "pong!"
}

function emitPing() {
ping()
}
}

在更简单的情况下, emitPing就足够了(我不必定义信号或处理程序 - 我只需在 emitPing 函数中设置文本)但如果我理解正确,函数和信号之间的区别在于函数调用是同步的,而该信号是异步的,出于某些原因(从 QML 启动但在 C++ 中处理的 GUI 状态之间的转换)我希望它是异步的。我也想避免写下无脑 emitPing 的必要性。无处不在的功能。

问题 : 有没有办法发出 ping信号,来自 C++ 代码,在 the_first_item 的上下文中只要?

最佳答案

由于它作为评论有所帮助,现在作为回答:

您可以使用 Qts MetaObject System 发出任何 QObject 的信号。在这种情况下,发出 ping the_first_item的信号, 只需调用 QMetaObject::invokeMethod(the_first_item, "ping");
关于整个元对象机制的更多信息可以在这里找到:The Meta-Object System .

关于c++ - 如何在 C++ 代码的特定 QML 项的上下文中发出信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33143255/

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