我已经将C++ enum暴露给Qt 5.7 QML,就像this question中描述的那样,这是类声明/实现:
#ifndef SPLASHSCREENLOGVIEWERMESSAGESTATUS_H
#define SPLASHSCREENLOGVIEWERMESSAGESTATUS_H
#include <QObject>
#include <QQmlEngine>
/**
* @class Enum class for splash screen log viewer message status
*/
class SplashScreenLogViewerMessageStatus : public QObject
{
Q_OBJECT
public:
/**
*! Splash screen log viewer message status enum
*/
enum messageStatus
{
STATUS_MESSAGE_LOADING=0x01, /*!< Message loading state */
STATUS_MESSAGE_LOAD_OK=0x02, /*!< Message load OK state */
STATUS_MESSAGE_LOAD_FAILED=0x03 /*!< Message load FAILED state */
};
Q_ENUM(messageStatus)
public:
/**
* @brief Constructor
*/
inline explicit SplashScreenLogViewerMessageStatus()
: QObject()
{
} // constructor
/**
* @brief QML type registration method
*/
inline static void registerQMLType()
{
qmlRegisterType<SplashScreenLogViewerMessageStatus>("com.example",
1,
0,
"SplashScreenLogViewerMessageType");
} // registerQMLType
}; // SplashScreenLogViewerMessageStatus (class)
#endif // SPLASHSCREENLOGVIEWERMESSAGESTATUS_H
并且我在以下课程中使用它:
#ifndef SPLASHSCREENLOGVIEWERMODELRECORD_H
#define SPLASHSCREENLOGVIEWERMODELRECORD_H
#include <QString>
#include "splashscreenlogviewermessagestatus.h"
/**
* @class Splash screen log viewer model record
*/
class SplashScreenLogViewerModelRecord
{
private:
/**
* @brief Message text
*/
QString messageText;
/**
* @brief Message status object
*/
SplashScreenLogViewerMessageStatus messageStatusObj;
public:
/**
* @brief Constructor
*/
SplashScreenLogViewerModelRecord();
/**
* @brief Constructor
*/
SplashScreenLogViewerModelRecord(const QString& messageText,
const SplashScreenLogViewerMessageStatus& messageStatusObj);
/**
* @brief Message text getter
* @return message text
*/
QString getMessageText() const;
/**
* @brief Message text setter
* @param text
*/
void setMessageText(const QString& text);
/**
* @brief Message status getter
* @return message status
*/
QString getMessageStatus() const;
/**
* @brief Message status setter
* @param status
*/
void setMessageStatus(const SplashScreenLogViewerMessageStatus& status);
};
#endif // SPLASHSCREENLOGVIEWERMODELRECORD_H
和实现:
#include "splashscreenlogviewermodelrecord.h"
SplashScreenLogViewerModelRecord::SplashScreenLogViewerModelRecord()
{
SplashScreenLogViewerMessageStatus messageStatus;
this->setMessageText(QString(""));
this->setMessageStatus(messageStatus);
} // constructor
QString SplashScreenLogViewerModelRecord::getMessageText() const
{
return this->messageText;
} // getMessageText
void SplashScreenLogViewerModelRecord::setMessageText(const QString& text)
{
this->messageText=text;
} // setMessageText
QString SplashScreenLogViewerModelRecord::getMessageStatus() const
{
if(this->messageStatusObj.messageStatus==SplashScreenLogViewerMessageStatus.STATUS_MESSAGE_LOADING)
{
return QString("Loading ...");
}
// else if(this->messageStatusObj.messageStatus==SplashScreenLogViewerMessageStatus.STATUS_MESSAGE_LOAD_OK)
// {
// return QString("Load OK.");
// }
// else if(this->messageStatusObj.messageStatus==SplashScreenLogViewerMessageStatus.STATUS_MESSAGE_LOAD_FAILED)
// {
// return QString("Load FAILED.");
// }
else
{
return QString("");
};
} // getMessageStatus
void SplashScreenLogViewerModelRecord::setMessageStatus(const SplashScreenLogViewerMessageStatus &status)
{
// this->messageStatus.SplashScreenLogViewerMessageStatusEnum=status.SplashScreenLogViewerMessageStatusEnum;
// this->messageStatus.messageStatus=status;
} // setMessageStatus
如果我尝试使用这些文件构建项目,则会出现以下错误:
models/splashscreenlogviewermodelrecord.cpp: In member function ‘QString SplashScreenLogViewerModelRecord::getMessageStatus() const’: models/splashscreenlogviewermodelrecord.cpp:23:31: error: invalid use of ‘enum SplashScreenLogViewerMessageStatus::messageStatus’
if(this->messageStatusObj.messageStatus ==SplashScreenLogViewerMessageStatus.STATUS_MESSAGE_LOADING)
^~~~~~~~~~~~~ models/splashscreenlogviewermodelrecord.cpp:23:81: error: expected primary-expression before ‘.’ token
if(this->messageStatusObj.messageStatus ==SplashScreenLogViewerMessageStatus.STATUS_MESSAGE_LOADING)
错误驻留在方法QString SplashScreenLogViewerModelRecord::getMessageStatus() const
中,特别是在其第一行:
if(this->messageStatusObj.messageStatus==SplashScreenLogViewerMessageStatus.STATUS_MESSAGE_LOADING)
如何比较enum
的值?我正在Qt Creator 4.9.2上使用Ubuntu 18.04.3 LTS 64bit。
答案 0 :(得分:3)
摆脱所有Qt混淆,剩下的大致是这样:
class Foo {
public:
enum fooValues { one, two };
};
void user(const Foo& foo) {
if (foo.fooValues == Foo::one) {
// doesn't compile
}
}
这里的问题是Foo::fooValues
是嵌套类型,而不是成员变量。您永远不会声明该类型的成员变量。
您对链接的答案有些误解,因为他们也不这样做。但是他们也不会尝试以这种方式使用它。请查看链接的问题,而不是您需要做什么。