Qt connect 有效,等效的断开方法是什么?

问题描述 投票:0回答:2

我有一个可以将 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'
c++ qt signals
2个回答
0
投票

QObject::connect函数返回一个QMetaObject::Connection,因此您可以将其传递给QObject::disconnect


0
投票

通常,您只需提供与

connect
调用中相同的详细信息(例如,源和目标对象、源信号和目标槽)。

但是,您正在使用的 special

connect
表单会返回一个
QMetaObject::Connection
对象,您可以存储该对象以供以后断开连接:

auto connection = Object::connect(this, &clsQtPushBtn::clicked, blah, blah);
:
QObject::disconnect(connection);

这很可能是更好的方法,因为它可以“立即”获取信息,而不是在可能很大的列表中搜索连接(尽管我对其实现方式可能是错误的)。它尤其更好,因为我相信在这种情况下它是唯一选项,因为每个 lambda 都是唯一的,所以无论如何你都不能使用新的来找到旧连接。 此外,我使用了局部变量来存储它,但您可能最好将其存储到某种成员变量中。

© www.soinside.com 2019 - 2024. All rights reserved.