将 QString 转换为其他类型

Convert QStrings to other types

我想将 QString 转换为不同的类型。我想尽可能通用和简单地执行此操作,而不必为每种类型编写显式方法。

我想到了使用模板函数,像这样:

template<typename T>
void getValueFromString(QString str, T& returnVal)
{
    returnVal = static_cast<T>(str);
}

显然这行不通,但我想要类似的东西。

有简单的方法吗?

QString 有很多转换方法,您可能不需要您的新函数,例如:

QString str = "FF";
bool ok;
int hex = str.toInt(&ok, 16);       // hex == 255, ok == true
int dec = str.toInt(&ok, 10);       // dec == 0, ok == false

我不确定是否可以从 QString 继承,但您可以从中创建一个 child 并覆盖转换。您可以覆盖 class 的转换,例如:

class Circle
{
public:
    Circle(int radius) : radius(radius) {}
    operator int() const { return radius; } 
private:
    int radius;
};

int x = static_cast<int>(aCircle);

同样,为 QString 覆盖 static_cast 看起来不合逻辑。

您可以使用流:

template<typename T>
void getValueFromString(QString str, T& returnVal)
{
    QTextStream stream(str);
    stream >> returnVal;
}

如果 Boost 是一个选项,您可以这样写:

#include <boost/lexical_cast.hpp>

template<typename T>
void getValueFromString(QString str, T& returnVal)
{
  returnVal = boost::lexical_cast<T>(str.toStdString());
}

参考文献:

此外,您可以使用 Qt's meta-object system,它适用于自定义类型。

struct MyStruct
{
    int i;
    ...
};
Q_DECLARE_METATYPE(MyStruct)

...

MyStruct s;
QVariant var;
var.setValue(s); // copy s into the variant

...

// retrieve the value
MyStruct s2 = var.value<MyStruct>();

请注意,QVariant 可以轻松转换为 QString


一些更详细的阅读是here