Qt名称空间的元类型信息

时间:2012-06-25 14:35:56

标签: c++ qt

如果您从Qt源代码中查看qnamespace.h,您会看到类似这样的内容:

#ifndef Q_MOC_RUN
namespace
#else
class Q_CORE_EXPORT
#endif
Qt {

#if defined(Q_MOC_RUN)
    Q_OBJECT
#endif

#if (defined(Q_MOC_RUN) || defined(QT_JAMBI_RUN))
    // NOTE: Generally, do not add Q_ENUMS if a corresponding Q_FLAGS exists.
    Q_ENUMS(ScrollBarPolicy FocusPolicy ContextMenuPolicy)
    Q_ENUMS(ArrowType ToolButtonStyle PenStyle PenCapStyle PenJoinStyle BrushStyle)
    Q_ENUMS(FillRule MaskMode BGMode ClipOperation SizeMode)
    Q_ENUMS(BackgroundMode) // Qt3

我对这段代码的解释是,moc预处理器被欺骗为生成假Qt对象的元类型信息。我怎样才能访问这个"假的"例如,获取QMetaEnum ArrowType和其他枚举的元对象?

1 个答案:

答案 0 :(得分:2)

下面的代码就是这么做的。输出是:

LeftArrow
#include <QtCore/QTextStream>
#include <QtCore/QMetaEnum>

struct StaticQtMetaObject : public QObject
{
    static inline const QMetaObject& get() {return staticQtMetaObject;}
};

int main(int argc, char *argv[])
{
    const QMetaObject& mo = StaticQtMetaObject::get();
    int index = mo.indexOfEnumerator("ArrowType");
    QMetaEnum me = mo.enumerator(index);
    Qt::ArrowType arrowType = Qt::LeftArrow;
    QTextStream(stdout) << me.valueToKey(arrowType) << endl;
    return 0;
}

http://qt-project.org/forums/viewthread/658提供