Я столкнулся с довольно причудливой ошибкой - QAction::trigger
вызывал появление диалогового окна блокировки, из-за чего мой сервер, который вызывал trigger
, зависал (например, не мог обрабатывать сигналы сокета, пока диалог не был закрыт).
Я придумал обходной путь. Я подключаю сигнал void triggerWorkaround()
к слоту QAction::trigger
с помощью Qt::QueuedConnection
и испускаю его:
QObject::connect(this, &HackClass::triggerWorkaround, targetAction_.data(), &QAction::trigger, Qt::QueuedConnection);
emit triggerWorkaround();
QObject::disconnect(this, nullptr, targetAction_.data(), nullptr);
Но это три строки запутанного кода. Есть ли способ сделать это без путаницы? Я нашел QMetaObject::invokeMethod
, но, честно говоря, это в 10 раз более запутанно, чем мое текущее решение. Кроме того, я никогда не хочу использовать имя метода в виде строки!