• 18757阅读
  • 15回复

请问如何将enum的成员存放到一个QStringList中? [复制链接]

上一主题 下一主题
离线hemingway22
 

只看楼主 倒序阅读 楼主  发表于: 2010-07-02
比如,enum myenum{A,B,C};
如何把A,B,C放入到一个QStringlist中呢?

如果成员很少,我当然可以逐个添加,但是如果成员很多,就不行了,有什么办法可以实现吗?
谢谢。
离线paranoid
只看该作者 1楼 发表于: 2010-07-02
c++中的枚举本质上是整型,不能直接放到QStringList中,得转换成QString
QStringList sl;
    for( int i = A; i <= C; ++i ) {
        sl << QString::number(i);
    }
离线dbzhang800

只看该作者 2楼 发表于: 2010-07-02
引用第1楼paranoid于2010-07-02 16:47发表的  :
c++中的枚举本质上是整型,不能直接放到QStringList中,得转换成QString
QStringList sl;
    for( int i = A; i <= C; ++i ) {
        sl << QString::number(i);
    }


对 C++ 是这样的,但Qt有了 meta object system,结果就不一样了,其中包括 这么一个宏 Q_ENUMS,这么一个类 QMetaEnum,等等
离线hemingway22

只看该作者 3楼 发表于: 2010-07-03
能说得详细点吗,这个宏怎么用?谢谢
离线dbzhang800

只看该作者 4楼 发表于: 2010-07-03
引用第3楼hemingway22于2010-07-03 11:40发表的  :
能说得详细点吗,这个宏怎么用?谢谢



简单整理了一下

http://hi.baidu.com/cyclone/blog/item/c49b1a4c9069bef4d72afcb3.html
离线paranoid
只看该作者 5楼 发表于: 2010-07-03
多谢dbzhang800兄的指点,以前一直没有注意过qt的meta object,借机会也学习了一下,原来这个是qt对c++的扩展,实现了RTTI,类似java中的反射。
另外那个include "main.moc"着实令人不舒服。。有啥更好的办法?
离线dbzhang800

只看该作者 6楼 发表于: 2010-07-03
引用第5楼paranoid于2010-07-03 21:33发表的  :
多谢dbzhang800兄的指点,以前一直没有注意过qt的meta object,借机会也学习了一下,原来这个是qt对c++的扩展,实现了RTTI,类似java中的反射。
另外那个include "main.moc"着实令人不舒服。。有啥更好的办法?


呵呵,不喜欢这个也简单,只要将类定义放到单独的 XXXX.h 头文件内即可。

原因是这样的,moc 会处理所有含有 Q_OBJECT 或  Q_GADGET 的 ***.h 和 ***.cpp 文件
对 ***.h文件,生成 moc_***.cpp 文件
对 ***.cpp 文件,生成 ***.moc 文件

qmake 能正确并自动地处理 moc_***.cpp 文件,而 ***.moc 就需要自己手动干预了
离线paranoid
只看该作者 7楼 发表于: 2010-07-03
嗯,这样就舒服多了
离线hemingway22

只看该作者 8楼 发表于: 2010-07-05
高手,多谢!
离线sbtree
只看该作者 9楼 发表于: 2010-07-05
这个宏Q_GADGET在哪里定义的?我的Qt帮助怎么没有,版本Qt4.5.2
windows 7 + VC++2008 + Qt4.5.2
离线meteor01

只看该作者 10楼 发表于: 2010-07-05
不错,学习!!!!!!!!!
www.puahzotech.com
离线sbtree
只看该作者 11楼 发表于: 2010-07-30
经过测试,发现问题
先说一下环境 Win Vista + VC2008 + Qt 5.2
baseitem.h
#ifndef BASEITEM_H
#define BASEITEM_H

#include <QtCore/QMetaEnum>
#include <QtCore/QDebug>
#include <QtCore/QStringList>

class BaseItem
{
    Q_GADGET
    Q_ENUMS(MyEnum)

public:
    enum MyEnum{AA, BB, CC, DD, EE};

    BaseItem();
    ~BaseItem();

private:
    QStringList m_myEnumList;
};

#endif // BASEITEM_H

baseitem.cpp

#include "baseitem.h"

BaseItem::BaseItem()
{
    QMetaEnum myEnum = staticMetaObject.enumerator(staticMetaObject.indexOfEnumerator("MyEnum"));
    for (int i=0; i<myEnum.keyCount(); ++i)
    {
        m_myEnumList << myEnum.key(i);
    }
    qDebug()<<m_myEnumList;
}

BaseItem::~BaseItem()
{

}
单独编译文件没问题
连接时候出错:
1>baseitem.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const BaseItem::staticMetaObject" (?staticMetaObject@BaseItem@@2UQMetaObject@@B)
1>D:\Projects\test\Debug\metatest.exe : fatal error LNK1120: 1 unresolved externals

仔细看了一下,Q_GADGET只是声明了一个静态QMetaObject,不知道是怎么初始化的,dbzhang800能给讲讲吗?我的问题出在哪里?
另外,为了生成moc_baseitem.cpp,特别对baseitem.h文件的属性作了设置,调用moc编译,实际上没有生成moc_baseitem.cpp
不知道是不是还有什么地方我没有注意到?
另一个奇怪的事情是,我重新创建了一个QObject的子类,头文件baseitem.h,然后手动把QObject的继承关系删除,并用Q_GADGET替代了Q_OBJECT宏,结果baseitem.h的属性不知什么原因也自动被清空了,根本没有了生成moc_xxxx.cpp的相关设置了,所以才有了上面我手工设置的想法,但是依然不成功
[ 此帖被sbtree在2010-07-31 00:15重新编辑 ]
windows 7 + VC++2008 + Qt4.5.2
离线sbtree
只看该作者 12楼 发表于: 2010-07-31
再上个图来:
windows 7 + VC++2008 + Qt4.5.2
离线sbtree
只看该作者 13楼 发表于: 2010-07-31
无奈,
尝试将生成moc_baseitem.cpp的命令行直接在命令窗口中执行了一下,好了,moc_baseitem.cpp生成了,再手工将生成的文件加入到工程文件中,编译连接都没问题了。
看来这个问题出在VC2008,进一步研究中,看看有没有办法自动生成moc_xxx.cpp文件,不然这种手工劳动量会很大,如果有很多类似的文件
windows 7 + VC++2008 + Qt4.5.2
离线dbzhang800

只看该作者 14楼 发表于: 2010-07-31
引用第13楼sbtree
仔细看了一下,Q_GADGET只是声明了一个静态QMetaObject,不知道是怎么初始化的,dbzhang800能给讲讲吗?我的问题出在哪里?


初始化没有什么特别的,既然类定义文件中 有静态成员变量 static struct QMetaObject const BaseItem::staticMetaObject;
那么它必然需要在类外进行定义,很容易想到会在生成的moc文件中,打开看看就能发现
  1. const QMetaObject BaseItem::staticMetaObject = ...


引用第13楼sbtree于2010-07-31 00:21发表的  :
无奈,
尝试将生成moc_baseitem.cpp的命令行直接在命令窗口中执行了一下,好了,moc_baseitem.cpp生成了,再手工将生成的文件加入到工程文件中,编译连接都没问题了。
看来这个问题出在VC2008,进一步研究中,看看有没有办法自动生成moc_xxx.cpp文件,不然这种手工劳动量会很大,如果有很多类似的文件



可能用 pro 文件更好一点,什么时候想用vs了,直接运行一下 qmake -tp vc ,vc的工程文件就生成了
离线sbtree
只看该作者 15楼 发表于: 2010-08-02
引用第14楼dbzhang800于2010-07-31 08:49发表的  :
可能用 pro 文件更好一点,什么时候想用vs了,直接运行一下 qmake -tp vc ,vc的工程文件就生成了


多谢dbzhang800!!
估计Qt的VS集成组件还需要完善才能解决这个问题。另外貌是Q_GADGET这个宏没有官方的公开使用声明
windows 7 + VC++2008 + Qt4.5.2
快速回复
限100 字节
 
上一个 下一个