Ответ 1
Последние версии Qt делают правильные вещи при выводе событий в поток отладки, поэтому ниже не требуется. Если вы получаете ошибку, похожую на warning C4273: 'operator <<' : inconsistent dll linkage
, это означает, что ваша версия Qt уже поддерживает это без необходимости использования кода ниже.
Макрос Q_GADGET
добавляет к классу член QMetaObject staticMetaObject
. Определение статического метаобъекта генерируется moc, а оно - в случае QEvent
- содержит информацию перечисления.
Ниже приведен пример того, как использовать это, чтобы дать более разумный вывод событий QDebug
.
#include <QEvent>
#include <QMetaEnum>
#include <QDebug>
/// Gives human-readable event type information.
QDebug operator<<(QDebug str, const QEvent * ev) {
static int eventEnumIndex = QEvent::staticMetaObject
.indexOfEnumerator("Type");
str << "QEvent";
if (ev) {
QString name = QEvent::staticMetaObject
.enumerator(eventEnumIndex).valueToKey(ev->type());
if (!name.isEmpty()) str << name; else str << ev->type();
} else {
str << (void*)ev;
}
return str.maybeSpace();
}
Пример использования:
void MyObject::event(QEvent* ev) {
qDebug() << "handling an event" << ev;
}