我有一个可以将 C++ 中的信号连接到 JavaScript 中的插槽的连接:
Object::connect(this, &clsQtPushBtn::clicked
,[pobjScriptEng, strCall, strFile, strScript]() {
QString strScriptWithCall = static_cast<QString>(strStript)
+ static_cast<QString>(strCall) + "();";
pobjScriptEng->evaluate(strScriptWithCall);
});
在上面的代码中:
这是我的 PushButton 类 clsQtPushBtn 的一个实例。 clsQtPushBtn::clicked 是“clicked”信号的地址。 pobjScriptEng 是指向 QJSEngine* 实例的指针。 strCall 是一个 JavaScript 函数“测试”。 strFile 是 JavaScript 文件“simon2.js”的名称。 strScript 是包含函数 test() 的 JavaScript 文件的内容。
问题是如何进行等效的断开连接调用,因为我遇到了困难,有 7 个选项,仅更改连接以断开连接是行不通的,我明白:
no matching member function for call to 'disconnect'
QObject::connect函数返回一个QMetaObject::Connection,因此您可以将其传递给QObject::disconnect。
通常,您只需提供与
connect
调用中相同的详细信息(例如,源和目标对象、源信号和目标槽)。
但是,您正在使用的 special
connect
表单会返回一个 QMetaObject::Connection
对象,您可以存储该对象以供以后断开连接:
auto connection = Object::connect(this, &clsQtPushBtn::clicked, blah, blah);
:
QObject::disconnect(connection);
这很可能是更好的方法,因为它可以“立即”获取信息,而不是在可能很大的列表中搜索连接(尽管我对其实现方式可能是错误的)。它尤其更好,因为我相信在这种情况下它是唯一选项,因为每个 lambda 都是唯一的,所以无论如何你都不能使用新的来找到旧连接。 此外,我使用了局部变量来存储它,但您可能最好将其存储到某种成员变量中。