Qt connect работает, каков эквивалентный метод отключения? - PullRequest
0 голосов
/ 19 апреля 2020

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

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

    no matching member function for call to 'disconnect'

Ответы [ 2 ]

0 голосов
/ 19 апреля 2020

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

0 голосов
/ 19 апреля 2020

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

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

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

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

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

...