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

标签 c++ qt qml

我有两个 QML 项,它们具有相同的接口(interface)(发出和处理的信号)和不同的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 ,它们都会处理 发出的 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函数中设置文本)但如果​​我理解正确的话,函数信号之间的区别在于,函数调用是同步的,而信号是异步的,并且由于某些原因(启动的GUI状态之间的转换)来自 QML 但用 C++ 处理)我希望它是异步的。我还希望避免在任何地方编写简单的 emitPing 函数。

问题:有没有办法仅在 the_first_item 上下文中从 C++ 代码发出 ping 信号?

最佳答案

既然它作为评论有帮助,现在作为答案:

您可以使用 Qts MetaObject 系统发出任何 QObject 的信号。在这种情况下,要发出 the_first_itemping 信号,只需调用 QMetaObject::invokeMethod(the_first_item, "ping");

有关整个元对象机制的更多信息可以在这里找到:The Meta-Object System .

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

相关文章:

c++ - 聚合初始化,将成员指针设置为相同的结构成员

c++ - 计算搜索比较 C++

c++ qt 托盘图标菜单 Action

C++/QML序列数据交换

c++ - 创建了我自己的 vector 类。能够重载流运算符,但无法按值打印c++

c++ - QReadWriteLock递归

c++ - 如何迭代QAbstractListModel?

javascript - 禁用 QML console.log() 消息

c++ - 将 null 分配给 QML 中 C++ 类型的 QObject* 属性时断言失败

c++ - 静态函数中不可访问的非静态成员