如何从c++代码中发出特定QML项上下文中的信号
How to emit signal in context of specific QML Item from C++ code
我有两个QML项目具有相同的接口(发出和处理的信号)和不同的objectName
属性值:
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++代码中完成它。我有一个指向使用findChild
方法和objectName
属性值检索的QQuickItem
类实例的指针。
处理从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
以相同的方式定义,它们都将处理the_instance_of_some_logic_property_name
发出的ping
信号,我只想触发其中一个。
现在,当我写它的时候,我认为也许在每个项目中提供一个实用程序函数,然后在其自己的上下文中发出ping
信号,像这样:
Text {
id: the_first_item
objectName: "the_first_item"
signal ping();
onPing: {
text = "pong!"
}
function emitPing() {
ping()
}
}
在一个更简单的情况下,emitPing
就足够了(我不需要定义信号和处理程序-我只会在emitPing
函数中设置文本),但如果我理解正确,函数和信号之间的区别是函数调用是同步的,而信号是异步的,并且由于某些原因(从QML发起的GUI状态之间的转换,但在c++中处理)我希望它是异步的。我还想避免在任何地方都写emitPing
函数的必要性。
问题:是否有一种方法可以从c++代码中发出ping
信号,仅在the_first_item
的上下文中?
既然作为评论有帮助,现在作为回答:
您可以使用Qts元对象系统发出任何QObject的信号。在本例中,要发出the_first_item
的ping
信号,只需调用QMetaObject::invokeMethod(the_first_item, "ping");
关于整个元对象机制的更多信息可以在这里找到:the meta - object System.
- 从C++实例化QML
- 使用CMake创建QML插件
- #为""定义宏;静态";针对不同的上下文
- 与互斥锁相比,旋转锁可以保证上下文切换
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- QT通过C++添加映射QML项目
- 如何在没有信号的情况下从C++执行QML插槽
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- QML按钮点击功能执行顺序
- 是否可以在单独的线程中将 QObject 设置为 QML 上下文属性?
- 可以从C++在QML上编写上下文属性吗?
- 当删除上下文属性中的QLIST对象时,QT QML应用程序崩溃
- Qt-Qml连接到上下文属性的QObject属性的信号
- 如何将 C++ 插件属性公开给 QML 上下文
- 如何为第三方渲染提供空的QML项目的OpenGL上下文
- 如何在 QML 文件中查找属性名称为字符串的 QML 上下文属性
- 哪些是将 QObject 列表传递给 QML 上下文的可能方法
- 从QQuickWidget上下文调用QML方法
- c++ /QML:如何为动态创建的组件定义和处理多个上下文
- QML 报告引用错误:XYZ 未在添加到上下文C++对象上定义