我想调试事件处理代码,并想将QEvent::Type
枚举的值转换为人类可读的字符串。QEvent
有一个Q_GADGET
宏,所以大概有办法把它拉下来?
问问题
8489 次
2 回答
25
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;
}
于 2014-03-20T14:07:15.657 回答
6
Q_GADGET 和 Q_ENUM 可以组合得到以下模板:
template<typename EnumType>
QString ToString(const EnumType& enumValue)
{
const char* enumName = qt_getEnumName(enumValue);
const QMetaObject* metaObject = qt_getEnumMetaObject(enumValue);
if (metaObject)
{
const int enumIndex = metaObject->indexOfEnumerator(enumName);
return QString("%1::%2::%3").arg(metaObject->className(), enumName, metaObject->enumerator(enumIndex).valueToKey(enumValue));
}
return QString("%1::%2").arg(enumName).arg(static_cast<int>(enumValue));
}
例子:
void MyObject::event(QEvent* ev)
{
qDebug() << ToString(ev->type());
}
于 2017-02-21T11:40:27.100 回答