我想制作一个 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)];
}
枚举基础类型必须是整数类型。所以你不能为此使用 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++
中的整数,但 Swift
和 Java
语言支持类似于您尝试过的东西。
无论如何,试试下面的方法。
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;
};
我一直在 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)];
}
枚举基础类型必须是整数类型。所以你不能为此使用 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++
中的整数,但 Swift
和 Java
语言支持类似于您尝试过的东西。
无论如何,试试下面的方法。
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;
};