将 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。
我想将 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。