Qt connect работает, какой эквивалентный метод отключения?

У меня есть работающее соединение, которое соединяет сигнал на 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 - это адрес "нажатого" сигнала. pobjScriptEng - это указатель на экземпляр QJSEngine *. strCall - это функция JavaScript "test". strFile - это имя файла JavaScript "simon2.js". strScript - это содержимое файла JavaScript, который содержит функцию test ().

Вопрос в том, как сделать эквивалентный вызов отключения, поскольку у меня с ним проблемы, есть 7 вариантов, и просто изменить соединение для отключения не работает, я получаю:

    no matching member function for call to 'disconnect'

person SPlatten    schedule 19.04.2020    source источник


Ответы (2)


Функция QObject :: connect возвращает QMetaObject :: Connection, чтобы вы могли передать его QObject :: disconnect.

person Szymon Janora    schedule 19.04.2020

Обычно вы просто предоставляете те же сведения, что и в вызове connect (например, исходный и целевой объекты, исходный сигнал и целевой слот).

Однако эта конкретная connect форма, которую вы используете, возвращает QMetaObject::Connection объект, который вы можете сохранить для последующего отключения:

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

Скорее всего, это лучший способ, поскольку он может получить информацию немедленно, а не искать соединение в возможно большом списке (хотя я могу ошибаться в том, как это реализовано). Это особенно лучше, так как я считаю, что в данном случае это единственный вариант, поскольку каждая лямбда уникальна, поэтому вы все равно не можете использовать новую для поиска старого соединения. .

Кроме того, я использовал локальную переменную для ее хранения, но вам, вероятно, будет лучше сохранить ее в какой-либо переменной-члене.

person paxdiablo    schedule 19.04.2020