2013-11-14 82 views
3

我有一个QObject类Message和另一个名为Request,它继承了消息类。这里是头文件:如何在Qt中使用枚举?

#ifndef MESSAGE_H 
#define MESSAGE_H 

#include <QObject> 

class Message : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit Message(QObject *parent = 0); 
    QString Source; 
    QString Destination; 
    QString Transaction; 
    QList<QObject> Content; 
signals: 

public slots: 

}; 

class Request : public Message 
{ 
    Q_OBJECT 
    Q_ENUMS(RequestTypes) 
public: 
    explicit Request(); 
    enum RequestTypes 
     { 
     SetData, 
     GetData 
     }; 

    RequestTypes Type; 
    QString Id; 
}; 

#endif // MESSAGE_H 

现在我想在我的代码中创建一个请求,并将Type设置为SetData。我怎样才能做到这一点?这是我当前的代码,它给出错误“'Request :: RequestTypes'不是一个类或名称空间”。从上面的头文件包含在我的主程序的头文件,所以Request是已知的,可以创建和我可以设置其他属性 - 但不是Type

Request *r = new Request(); 
r->Source = "My Source"; 
r->Destination = "My Destination"; 
r->Type = Request::RequestTypes::SetData; 

换句话说:我能,以及对RequestType属性采取了QString,但使用枚举做到这一点会更好也更安全。有人能告诉我这里有什么问题吗?

+0

这应该很好地工作。你能否提供完整和未经编辑的错误信息,以及一个引发错误的完整程序(.e。a [SSCCe](http://sscce.org/))? –

+0

没有什么更多,这里是完整的错误信息(当使用我的问题代码时):mainwindow.cpp:235:24:错误:'Request :: RequestTypes'不是一个类或命名空间 make:*** [mainwindow .o]错误1 – Robert

+0

这很奇怪,Request :: RequestTypes :: SetData应该可以正常工作。也许这与Qt预处理有关,这会影响C++的正常使用。 –

回答

7

您需要声明的枚举像这样:

enum class RequestTypes 
    { 
    SetData, 
    GetData 
    }; 

为了像你这样使用它,但是这需要C++ 11。

正常用法是(你的情况): r->Type = RequestTypes::SetData;

+0

就是这样,谢谢! – Robert