繁体   English   中英

如何从QEvent获取人类可读的事件类型?

[英]How to get human-readable event type from QEvent?

我想调试事件处理代码,并希望将QEvent::Type枚举值转换为人类可读的字符串。 QEvent有一个Q_GADGET宏,所以可能有一种方法可以解决这个问题吗?

最新版本的Qt在将事件输出到调试流时做了正确的事情,因此下面不是必需的。 如果您收到类似于warning C4273: 'operator <<' : inconsistent dll linkage的错误warning C4273: 'operator <<' : inconsistent dll linkage ,则表示您的Qt版本已经支持此版本而无需下面的代码。

Q_GADGET宏将QMetaObject staticMetaObject成员添加到类中。 静态元对象的定义由moc生成,而在QEvent的情况下,它包含枚举信息。

下面是如何利用它来提供更合理的QDebug事件输出的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;
}

可以组合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());
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM