将qstring转换为其他类型

Convert QStrings to other types

本文关键字:其他 类型 转换 qstring      更新时间:2023-10-16

我想将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继承,但您可以从中创建一个孩子并覆盖强制转换。您可以重写类的强制转换,例如:

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看起来不符合逻辑。

您可以使用stream:

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

此外,您可以使用Qt的元对象系统,它可以很好地处理自定义类型。

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


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

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

引用:

  • toStdString()
  • Boost lexical_cast<>