QObject: use more categorized logging

Introduce a category for debug/warning prints coming from connect()
and related functions. As a drive-by, rename and complete the
usage of logging categories for connectSlotsByName().

Change-Id: Ieb2d8641df856c8c60317757eda80dc5f9375130
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
This commit is contained in:
Giuseppe D'Angelo 2020-09-25 18:53:09 +02:00
parent 9152e3babc
commit 98ae35acd6

View File

@ -78,7 +78,8 @@ QT_BEGIN_NAMESPACE
static int DIRECT_CONNECTION_ONLY = 0; static int DIRECT_CONNECTION_ONLY = 0;
Q_LOGGING_CATEGORY(lcConnections, "qt.core.qmetaobject.connectslotsbyname") Q_LOGGING_CATEGORY(lcConnectSlotsByName, "qt.core.qmetaobject.connectslotsbyname")
Q_LOGGING_CATEGORY(lcConnect, "qt.core.qobject.connect")
Q_CORE_EXPORT QBasicAtomicPointer<QSignalSpyCallbackSet> qt_signal_spy_callback_set = Q_BASIC_ATOMIC_INITIALIZER(nullptr); Q_CORE_EXPORT QBasicAtomicPointer<QSignalSpyCallbackSet> qt_signal_spy_callback_set = Q_BASIC_ATOMIC_INITIALIZER(nullptr);
@ -108,7 +109,7 @@ static int *queuedConnectionTypes(const QMetaMethod& method)
typeIds[i] = metaType.id(); typeIds[i] = metaType.id();
if (!typeIds[i]) { if (!typeIds[i]) {
const QByteArray typeName = method.parameterTypeName(i); const QByteArray typeName = method.parameterTypeName(i);
qWarning("QObject::connect: Cannot queue arguments of type '%s'\n" qCWarning(lcConnect, "QObject::connect: Cannot queue arguments of type '%s'\n"
"(Make sure '%s' is registered using qRegisterMetaType().)", "(Make sure '%s' is registered using qRegisterMetaType().)",
typeName.constData(), typeName.constData()); typeName.constData(), typeName.constData());
delete [] typeIds; delete [] typeIds;
@ -133,7 +134,7 @@ static int *queuedConnectionTypes(const QArgumentType *argumentTypes, int argc)
types[i] = QMetaType::fromName(type.name()).id(); types[i] = QMetaType::fromName(type.name()).id();
if (!types[i]) { if (!types[i]) {
qWarning("QObject::connect: Cannot queue arguments of type '%s'\n" qCWarning(lcConnect, "QObject::connect: Cannot queue arguments of type '%s'\n"
"(Make sure '%s' is registered using qRegisterMetaType().)", "(Make sure '%s' is registered using qRegisterMetaType().)",
type.name().constData(), type.name().constData()); type.name().constData(), type.name().constData());
return nullptr; return nullptr;
@ -2315,10 +2316,10 @@ static bool check_signal_macro(const QObject *sender, const char *signal,
int sigcode = extract_code(signal); int sigcode = extract_code(signal);
if (sigcode != QSIGNAL_CODE) { if (sigcode != QSIGNAL_CODE) {
if (sigcode == QSLOT_CODE) if (sigcode == QSLOT_CODE)
qWarning("QObject::%s: Attempt to %s non-signal %s::%s", qCWarning(lcConnect, "QObject::%s: Attempt to %s non-signal %s::%s",
func, op, sender->metaObject()->className(), signal+1); func, op, sender->metaObject()->className(), signal+1);
else else
qWarning("QObject::%s: Use the SIGNAL macro to %s %s::%s", qCWarning(lcConnect, "QObject::%s: Use the SIGNAL macro to %s %s::%s",
func, op, sender->metaObject()->className(), signal); func, op, sender->metaObject()->className(), signal);
return false; return false;
} }
@ -2329,7 +2330,7 @@ static bool check_method_code(int code, const QObject *object,
const char *method, const char *func) const char *method, const char *func)
{ {
if (code != QSLOT_CODE && code != QSIGNAL_CODE) { if (code != QSLOT_CODE && code != QSIGNAL_CODE) {
qWarning("QObject::%s: Use the SLOT or SIGNAL macro to " qCWarning(lcConnect, "QObject::%s: Use the SLOT or SIGNAL macro to "
"%s %s::%s", func, func, object->metaObject()->className(), method); "%s %s::%s", func, func, object->metaObject()->className(), method);
return false; return false;
} }
@ -2346,11 +2347,11 @@ static void err_method_notfound(const QObject *object,
} }
const char *loc = extract_location(method); const char *loc = extract_location(method);
if (strchr(method,')') == nullptr) // common typing mistake if (strchr(method,')') == nullptr) // common typing mistake
qWarning("QObject::%s: Parentheses expected, %s %s::%s%s%s", qCWarning(lcConnect, "QObject::%s: Parentheses expected, %s %s::%s%s%s",
func, type, object->metaObject()->className(), method+1, func, type, object->metaObject()->className(), method+1,
loc ? " in ": "", loc ? loc : ""); loc ? " in ": "", loc ? loc : "");
else else
qWarning("QObject::%s: No such %s %s::%s%s%s", qCWarning(lcConnect, "QObject::%s: No such %s %s::%s%s%s",
func, type, object->metaObject()->className(), method+1, func, type, object->metaObject()->className(), method+1,
loc ? " in ": "", loc ? loc : ""); loc ? " in ": "", loc ? loc : "");
@ -2364,9 +2365,9 @@ static void err_info_about_objects(const char * func,
QString a = sender ? sender->objectName() : QString(); QString a = sender ? sender->objectName() : QString();
QString b = receiver ? receiver->objectName() : QString(); QString b = receiver ? receiver->objectName() : QString();
if (!a.isEmpty()) if (!a.isEmpty())
qWarning("QObject::%s: (sender name: '%s')", func, a.toLocal8Bit().data()); qCWarning(lcConnect, "QObject::%s: (sender name: '%s')", func, a.toLocal8Bit().data());
if (!b.isEmpty()) if (!b.isEmpty())
qWarning("QObject::%s: (receiver name: '%s')", func, b.toLocal8Bit().data()); qCWarning(lcConnect, "QObject::%s: (receiver name: '%s')", func, b.toLocal8Bit().data());
} }
/*! /*!
@ -2609,11 +2610,11 @@ static inline void check_and_warn_compat(const QMetaObject *sender, const QMetaM
{ {
if (signal.attributes() & QMetaMethod::Compatibility) { if (signal.attributes() & QMetaMethod::Compatibility) {
if (!(method.attributes() & QMetaMethod::Compatibility)) if (!(method.attributes() & QMetaMethod::Compatibility))
qWarning("QObject::connect: Connecting from COMPAT signal (%s::%s)", qCWarning(lcConnect, "QObject::connect: Connecting from COMPAT signal (%s::%s)",
sender->className(), signal.methodSignature().constData()); sender->className(), signal.methodSignature().constData());
} else if ((method.attributes() & QMetaMethod::Compatibility) && } else if ((method.attributes() & QMetaMethod::Compatibility) &&
method.methodType() == QMetaMethod::Signal) { method.methodType() == QMetaMethod::Signal) {
qWarning("QObject::connect: Connecting from %s::%s to COMPAT slot (%s::%s)", qCWarning(lcConnect, "QObject::connect: Connecting from %s::%s to COMPAT slot (%s::%s)",
sender->className(), signal.methodSignature().constData(), sender->className(), signal.methodSignature().constData(),
receiver->className(), method.methodSignature().constData()); receiver->className(), method.methodSignature().constData());
} }
@ -2696,7 +2697,7 @@ QMetaObject::Connection QObject::connect(const QObject *sender, const char *sign
Qt::ConnectionType type) Qt::ConnectionType type)
{ {
if (sender == nullptr || receiver == nullptr || signal == nullptr || method == nullptr) { if (sender == nullptr || receiver == nullptr || signal == nullptr || method == nullptr) {
qWarning("QObject::connect: Cannot connect %s::%s to %s::%s", qCWarning(lcConnect, "QObject::connect: Cannot connect %s::%s to %s::%s",
sender ? sender->metaObject()->className() : "(nullptr)", sender ? sender->metaObject()->className() : "(nullptr)",
(signal && *signal) ? signal+1 : "(nullptr)", (signal && *signal) ? signal+1 : "(nullptr)",
receiver ? receiver->metaObject()->className() : "(nullptr)", receiver ? receiver->metaObject()->className() : "(nullptr)",
@ -2786,7 +2787,7 @@ QMetaObject::Connection QObject::connect(const QObject *sender, const char *sign
if (!QMetaObjectPrivate::checkConnectArgs(signalTypes.size(), signalTypes.constData(), if (!QMetaObjectPrivate::checkConnectArgs(signalTypes.size(), signalTypes.constData(),
methodTypes.size(), methodTypes.constData())) { methodTypes.size(), methodTypes.constData())) {
qWarning("QObject::connect: Incompatible sender/receiver arguments" qCWarning(lcConnect, "QObject::connect: Incompatible sender/receiver arguments"
"\n %s::%s --> %s::%s", "\n %s::%s --> %s::%s",
sender->metaObject()->className(), signal, sender->metaObject()->className(), signal,
receiver->metaObject()->className(), method); receiver->metaObject()->className(), method);
@ -2837,7 +2838,7 @@ QMetaObject::Connection QObject::connect(const QObject *sender, const QMetaMetho
|| receiver == nullptr || receiver == nullptr
|| signal.methodType() != QMetaMethod::Signal || signal.methodType() != QMetaMethod::Signal
|| method.methodType() == QMetaMethod::Constructor) { || method.methodType() == QMetaMethod::Constructor) {
qWarning("QObject::connect: Cannot connect %s::%s to %s::%s", qCWarning(lcConnect, "QObject::connect: Cannot connect %s::%s to %s::%s",
sender ? sender->metaObject()->className() : "(nullptr)", sender ? sender->metaObject()->className() : "(nullptr)",
signal.methodSignature().constData(), signal.methodSignature().constData(),
receiver ? receiver->metaObject()->className() : "(nullptr)", receiver ? receiver->metaObject()->className() : "(nullptr)",
@ -2856,18 +2857,18 @@ QMetaObject::Connection QObject::connect(const QObject *sender, const QMetaMetho
const QMetaObject *smeta = sender->metaObject(); const QMetaObject *smeta = sender->metaObject();
const QMetaObject *rmeta = receiver->metaObject(); const QMetaObject *rmeta = receiver->metaObject();
if (signal_index == -1) { if (signal_index == -1) {
qWarning("QObject::connect: Can't find signal %s on instance of class %s", qCWarning(lcConnect, "QObject::connect: Can't find signal %s on instance of class %s",
signal.methodSignature().constData(), smeta->className()); signal.methodSignature().constData(), smeta->className());
return QMetaObject::Connection(nullptr); return QMetaObject::Connection(nullptr);
} }
if (method_index == -1) { if (method_index == -1) {
qWarning("QObject::connect: Can't find method %s on instance of class %s", qCWarning(lcConnect, "QObject::connect: Can't find method %s on instance of class %s",
method.methodSignature().constData(), rmeta->className()); method.methodSignature().constData(), rmeta->className());
return QMetaObject::Connection(nullptr); return QMetaObject::Connection(nullptr);
} }
if (!QMetaObject::checkConnectArgs(signal.methodSignature().constData(), method.methodSignature().constData())) { if (!QMetaObject::checkConnectArgs(signal.methodSignature().constData(), method.methodSignature().constData())) {
qWarning("QObject::connect: Incompatible sender/receiver arguments" qCWarning(lcConnect, "QObject::connect: Incompatible sender/receiver arguments"
"\n %s::%s --> %s::%s", "\n %s::%s --> %s::%s",
smeta->className(), signal.methodSignature().constData(), smeta->className(), signal.methodSignature().constData(),
rmeta->className(), method.methodSignature().constData()); rmeta->className(), method.methodSignature().constData());
@ -2967,7 +2968,7 @@ bool QObject::disconnect(const QObject *sender, const char *signal,
const QObject *receiver, const char *method) const QObject *receiver, const char *method)
{ {
if (sender == nullptr || (receiver == nullptr && method != nullptr)) { if (sender == nullptr || (receiver == nullptr && method != nullptr)) {
qWarning("QObject::disconnect: Unexpected nullptr parameter"); qCWarning(lcConnect, "QObject::disconnect: Unexpected nullptr parameter");
return false; return false;
} }
@ -3102,12 +3103,12 @@ bool QObject::disconnect(const QObject *sender, const QMetaMethod &signal,
const QObject *receiver, const QMetaMethod &method) const QObject *receiver, const QMetaMethod &method)
{ {
if (sender == nullptr || (receiver == nullptr && method.mobj != nullptr)) { if (sender == nullptr || (receiver == nullptr && method.mobj != nullptr)) {
qWarning("QObject::disconnect: Unexpected nullptr parameter"); qCWarning(lcConnect, "QObject::disconnect: Unexpected nullptr parameter");
return false; return false;
} }
if (signal.mobj) { if (signal.mobj) {
if(signal.methodType() != QMetaMethod::Signal) { if(signal.methodType() != QMetaMethod::Signal) {
qWarning("QObject::%s: Attempt to %s non-signal %s::%s", qCWarning(lcConnect, "QObject::%s: Attempt to %s non-signal %s::%s",
"disconnect","unbind", "disconnect","unbind",
sender->metaObject()->className(), signal.methodSignature().constData()); sender->metaObject()->className(), signal.methodSignature().constData());
return false; return false;
@ -3115,7 +3116,7 @@ bool QObject::disconnect(const QObject *sender, const QMetaMethod &signal,
} }
if (method.mobj) { if (method.mobj) {
if(method.methodType() == QMetaMethod::Constructor) { if(method.methodType() == QMetaMethod::Constructor) {
qWarning("QObject::disconnect: cannot use constructor as argument %s::%s", qCWarning(lcConnect, "QObject::disconnect: cannot use constructor as argument %s::%s",
receiver->metaObject()->className(), method.methodSignature().constData()); receiver->metaObject()->className(), method.methodSignature().constData());
return false; return false;
} }
@ -3139,13 +3140,13 @@ bool QObject::disconnect(const QObject *sender, const QMetaMethod &signal,
// If we are here sender is not nullptr. If signal is not nullptr while signal_index // If we are here sender is not nullptr. If signal is not nullptr while signal_index
// is -1 then this signal is not a member of sender. // is -1 then this signal is not a member of sender.
if (signal.mobj && signal_index == -1) { if (signal.mobj && signal_index == -1) {
qWarning("QObject::disconnect: signal %s not found on class %s", qCWarning(lcConnect, "QObject::disconnect: signal %s not found on class %s",
signal.methodSignature().constData(), sender->metaObject()->className()); signal.methodSignature().constData(), sender->metaObject()->className());
return false; return false;
} }
// If this condition is true then method is not a member of receiver. // If this condition is true then method is not a member of receiver.
if (receiver && method.mobj && method_index == -1) { if (receiver && method.mobj && method_index == -1) {
qWarning("QObject::disconnect: method %s not found on class %s", qCWarning(lcConnect, "QObject::disconnect: method %s not found on class %s",
method.methodSignature().constData(), receiver->metaObject()->className()); method.methodSignature().constData(), receiver->metaObject()->className());
return false; return false;
} }
@ -3584,7 +3585,7 @@ void QMetaObject::connectSlotsByName(QObject *o)
} }
} }
if (compatibleSignals.size() > 1) if (compatibleSignals.size() > 1)
qWarning() << "QMetaObject::connectSlotsByName: Connecting slot" << slot qCWarning(lcConnectSlotsByName) << "QMetaObject::connectSlotsByName: Connecting slot" << slot
<< "with the first of the following compatible signals:" << compatibleSignals; << "with the first of the following compatible signals:" << compatibleSignals;
} }
@ -3594,7 +3595,7 @@ void QMetaObject::connectSlotsByName(QObject *o)
// we connect it... // we connect it...
if (Connection(QMetaObjectPrivate::connect(co, sigIndex, smeta, o, i))) { if (Connection(QMetaObjectPrivate::connect(co, sigIndex, smeta, o, i))) {
foundIt = true; foundIt = true;
qCDebug(lcConnections, "%s", qCDebug(lcConnectSlotsByName, "%s",
msgConnect(smeta, coName, QMetaObjectPrivate::signal(smeta, sigIndex), o, i).constData()); msgConnect(smeta, coName, QMetaObjectPrivate::signal(smeta, sigIndex), o, i).constData());
// ...and stop looking for further objects with the same name. // ...and stop looking for further objects with the same name.
// Note: the Designer will make sure each object name is unique in the above // Note: the Designer will make sure each object name is unique in the above
@ -3612,7 +3613,7 @@ void QMetaObject::connectSlotsByName(QObject *o)
int iParen = slotSignature.indexOf('('); int iParen = slotSignature.indexOf('(');
int iLastUnderscore = slotSignature.lastIndexOf('_', iParen-1); int iLastUnderscore = slotSignature.lastIndexOf('_', iParen-1);
if (iLastUnderscore > 3) if (iLastUnderscore > 3)
qWarning("QMetaObject::connectSlotsByName: No matching signal for %s", slot); qCWarning(lcConnectSlotsByName, "QMetaObject::connectSlotsByName: No matching signal for %s", slot);
} }
} }
} }
@ -4866,7 +4867,7 @@ QMetaObject::Connection QObject::connectImpl(const QObject *sender, void **signa
const int *types, const QMetaObject *senderMetaObject) const int *types, const QMetaObject *senderMetaObject)
{ {
if (!signal) { if (!signal) {
qWarning("QObject::connect: invalid nullptr parameter"); qCWarning(lcConnect, "QObject::connect: invalid nullptr parameter");
if (slotObj) if (slotObj)
slotObj->destroyIfLastRef(); slotObj->destroyIfLastRef();
return QMetaObject::Connection(); return QMetaObject::Connection();
@ -4880,7 +4881,7 @@ QMetaObject::Connection QObject::connectImpl(const QObject *sender, void **signa
break; break;
} }
if (!senderMetaObject) { if (!senderMetaObject) {
qWarning("QObject::connect: signal not found in %s", sender->metaObject()->className()); qCWarning(lcConnect, "QObject::connect: signal not found in %s", sender->metaObject()->className());
slotObj->destroyIfLastRef(); slotObj->destroyIfLastRef();
return QMetaObject::Connection(nullptr); return QMetaObject::Connection(nullptr);
} }
@ -4906,7 +4907,7 @@ QMetaObject::Connection QObjectPrivate::connectImpl(const QObject *sender, int s
: "Unknown"; : "Unknown";
const char *receiverString = receiver ? receiver->metaObject()->className() const char *receiverString = receiver ? receiver->metaObject()->className()
: "Unknown"; : "Unknown";
qWarning("QObject::connect(%s, %s): invalid nullptr parameter", senderString, receiverString); qCWarning(lcConnect, "QObject::connect(%s, %s): invalid nullptr parameter", senderString, receiverString);
if (slotObj) if (slotObj)
slotObj->destroyIfLastRef(); slotObj->destroyIfLastRef();
return QMetaObject::Connection(); return QMetaObject::Connection();
@ -5050,7 +5051,7 @@ bool QObject::disconnect(const QMetaObject::Connection &connection)
bool QObject::disconnectImpl(const QObject *sender, void **signal, const QObject *receiver, void **slot, const QMetaObject *senderMetaObject) bool QObject::disconnectImpl(const QObject *sender, void **signal, const QObject *receiver, void **slot, const QMetaObject *senderMetaObject)
{ {
if (sender == nullptr || (receiver == nullptr && slot != nullptr)) { if (sender == nullptr || (receiver == nullptr && slot != nullptr)) {
qWarning("QObject::disconnect: Unexpected nullptr parameter"); qCWarning(lcConnect, "QObject::disconnect: Unexpected nullptr parameter");
return false; return false;
} }
@ -5063,7 +5064,7 @@ bool QObject::disconnectImpl(const QObject *sender, void **signal, const QObject
break; break;
} }
if (!senderMetaObject) { if (!senderMetaObject) {
qWarning("QObject::disconnect: signal not found in %s", sender->metaObject()->className()); qCWarning(lcConnect, "QObject::disconnect: signal not found in %s", sender->metaObject()->className());
return false; return false;
} }
signal_index += QMetaObjectPrivate::signalOffset(senderMetaObject); signal_index += QMetaObjectPrivate::signalOffset(senderMetaObject);
@ -5081,7 +5082,7 @@ bool QObject::disconnectImpl(const QObject *sender, void **signal, const QObject
QMetaObject::Connection QObjectPrivate::connect(const QObject *sender, int signal_index, QtPrivate::QSlotObjectBase *slotObj, Qt::ConnectionType type) QMetaObject::Connection QObjectPrivate::connect(const QObject *sender, int signal_index, QtPrivate::QSlotObjectBase *slotObj, Qt::ConnectionType type)
{ {
if (!sender) { if (!sender) {
qWarning("QObject::connect: invalid nullptr parameter"); qCWarning(lcConnect, "QObject::connect: invalid nullptr parameter");
if (slotObj) if (slotObj)
slotObj->destroyIfLastRef(); slotObj->destroyIfLastRef();
return QMetaObject::Connection(); return QMetaObject::Connection();