1

如果您查看qnamespace.h来自 Qt 的源代码,您会看到如下内容:

#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 对象生成元类型信息。如何访问这个“假”元对象以获取例如QMetaEnumforArrowType和其他枚举?

4

1 回答 1

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

于 2012-06-25T14:56:02.830 回答