Тестирование лямбда-уникального соединения в Qt

Мой вопрос: как проверить, существует ли соединение в Qt, когда слот является лямбда-функцией?

У меня есть следующий фрагмент кода

connect(item1, &Item::somethingChanged, this, [this](){ doSomething(m_someObject1, 2); }, Qt::DirectConnection);

connect(item2, &Item::somethingChanged, this, [this](){ doSomething(m_someObject2, 5); }, Qt::DirectConnection);

Я хочу проверить, существует ли это соединение в моем GoogleTest:

ASSERT_FALSE(QObject::connect(item1, &Item::somethingChanged, this, [this](){ doSomething(m_someObject1, 2); }, Qt::UniqueConnection));

Это, однако, не работает, потому что лямбда-слот считается другим, чем тот, который я подключил в своем классе. Как мне проверить, существует ли это соединение?

1 ответ

Если я правильно понимаю ваш вопрос, вы можете легко проверить, существует ли соединение отправитель-лямбда с классом соединений QMetaObject. Вы можете определить QMetaObject::Connection переменная (скажем, QMetaObject::Connection ourConnection) и установите его значение для соединения. Эта переменная теперь является дескриптором этого соединения.

Если ourConnection устанавливается на работающий экземпляр соединения, он будет возвращать true:

QMetaObject::Connection ourConnection = connect(ui->ourAction, &QAction::triggered, this, []{
     // Do stuff;
});
qDebug() << ourConnection; // returns true

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

QMetaObject::Connection ourConnection = connect(ui->ourAction, &QAction::triggered, this, []{
     // Do stuff;
});
disconnect(ourConnection);
qDebug() << ourConnection; // returns false

Если ourConnection вообще не установлен для экземпляра соединения, он будет возвращать false:

QMetaObject::Connection ourConnection;
qDebug() << ourConnection; // returns false
Другие вопросы по тегам