Skip to content

Instantly share code, notes, and snippets.

@webmaster128
Last active October 1, 2023 21:01
Show Gist options
  • Select an option

  • Save webmaster128/2d4df2e46818d4e76fb7f7b8940c841a to your computer and use it in GitHub Desktop.

Select an option

Save webmaster128/2d4df2e46818d4e76fb7f7b8940c841a to your computer and use it in GitHub Desktop.
bool ExceptionAwareQApplication::notify(QObject *receiver, QEvent *event)
{
try
{
return QApplication::notify(receiver, event);
}
catch (std::exception &ex)
{
// Type QMetaCallEvent requires private header <private/qobject_p.h>
QMetaCallEvent *metaCallEvent = dynamic_cast<QMetaCallEvent *>(event);
if (metaCallEvent)
{
QString receiverClassName = receiver->metaObject()->className();
QString signalSignature;
const auto sender = metaCallEvent->sender();
const auto senderMeta = sender->metaObject();
for (auto i = senderMeta->methodOffset(); i < senderMeta->methodCount(); ++i)
{
const auto method = senderMeta->method(i);
if (QMetaObjectPrivate::signalIndex(method) == metaCallEvent->signalId())
{
signalSignature = QString::fromUtf8(method.methodSignature());
}
}
QString senderClassName = senderMeta->className();
qDebug() << "Caught std::exception during Qt slot invocation in class "
<< receiverClassName
<< " after emitting signal " << signalSignature
<< " from sender " << senderClassName;
}
// log exception content
return false;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment