13

QEvent::Typeイベント処理コードをデバッグし、 enum の値を人間が読める文字列に変換したいと考えています。QEventマクロがQ_GADGETあるので、おそらくそれをやってのける方法はありますか?

4

2 に答える 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 に答える