我已经将C++ 枚举暴露给Qt 5.7 QML,就像在这个问题中描述的那样,这里是类声明/实现:
#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)
错误存在于 method 中QString SplashScreenLogViewerModelRecord::getMessageStatus() const
,特别是在它的第一行:
if(this->messageStatusObj.messageStatus==SplashScreenLogViewerMessageStatus.STATUS_MESSAGE_LOADING)
我如何比较enum
价值?我在Ubuntu 18.04.3 LTS 64bit上使用Qt Creator 4.9.2。
摆脱所有的 Qt 混淆,剩下的大致是这样的:
class Foo {
public:
enum fooValues { one, two };
};
void user(const Foo& foo) {
if (foo.fooValues == Foo::one) {
// doesn't compile
}
}
这里的问题是它Foo::fooValues
是一个嵌套类型,而不是一个成员变量。您永远不会声明该类型的成员变量。
您被链接的答案稍微误导了,因为他们也不这样做。但他们也不试图以这种方式使用它。查看链接的问题,而不是关于您需要做什么。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句