我想制作一个 QString 格式的 C++ 枚举来显示 QTime

I want to make a C++ enum of QString formats to display a QTime

我一直在 Qt 中使用 C++ class,我需要编写一个 enum class,其中包含我在 showTime() 中使用的格式。由于 QString 格式的性质,我遇到了以下错误 the value is not convertible to 'int'。我很乐意感谢任何帮助或建议。

P.S:代码如下:

enum class TimeFormat {
    a = "hh:mm:ss",
    b = "hh:mm",
    c = "H:m:s a"
};

class Time {
public:
    Time();
    ~Time();

    void setTime(QTime t);
    QString showTime(){
         return time->toString(format);
    }
private:
    QTime* time;
    TimeFormat format;
};

枚举基础类型必须是整数类型。它不能是一个字符串。您可以使用 sone 代码将字符串与枚举值相关联。

示例(最低 C++17):

enum class TimeFormat {
    a,
    b,
    c
};

constexpr std::string_view toStringFormat(TimeFormat format)
{
    using namespace std::literals;
    constexpr std::array formats{ "hh:mm:ss"sv, "hh:mm"sv, "H:m:s a"sv};
    return formats[static_cast<size_t>(format)];
}

https://godbolt.org/z/Y6P6Wa4K5

枚举基础类型必须是整数类型。所以你不能为此使用 char const* 。在您的情况下,您可以使用与您的枚举关联的私有数组:

class Time {
public:
  enum class Format {
    a, b, c
  };

public:
    Time();
    ~Time();

    void setTime(QTime t);
    QString showTime(Format const f){
         time->toString(format.at(static_cast<size_t>(f));
    }
private:
    QTime* time;
    static inline std::array<char const*, 3> constexpr format = 
    { "hh:mm:ss", "hh:mm", "H:m:s a" };
};

枚举的基础类型必须是 C++ 中的整数,但 SwiftJava 语言支持类似于您尝试过的东西。

无论如何,试试下面的方法。

my-time.h 文件:

enum TimeFormat {
    a,
    b,
    c
};

class Time {
public:
    Time();
    ~Time();

    void setTime(QTime t);
    QString showTime();
private:
    QTime* time;
    TimeFormat format;
};

my-time.cpp 文件:

#include "my-time.h"

const char * const FORMAT_STRING_MAP[] = [
    "hh:mm:ss",
    "hh:mm",
    "H:m:s a"
];

QString Time::showTime()
{
    time->toString(FORMAT_STRING_MAP[format]);
}

我使用了 switch 语句

enum class TimeFormat {
    format1,
    format2,
    format3,
};

class Time {
public:
    Time();
    ~Time();

    void setTime(int h, int m, int s);
    QString showTime() const{
        QString f;
        switch (format) {
            case TimeFormat::format1:
            f="hh:mm:ss";
            break;
         case TimeFormat::format2:
            f = "hh:mm";
            break;
         case TimeFormat::format3:
            f= "H:m:s a";
            break;
         }
         return time->toString(f);
    }

    void changeFormat(TimeFormat f);
private:
    QTime* time;
    TimeFormat format;
};