std::string 和 QVariant 之间的转换(反之亦然) Qt5
conversion between std::string and QVariant (and vice versa) Qt5
我很难将 std::string 转换为 QVariant 并将 QVariant 转换回 std::string。在这两种情况下,我都得到空值(默认 QVariant,就像它没有参数初始化一样)和空 std::string ("").
这些是我的代码的相关部分:
bool TestItemListModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
// processing of other function arguments, checks, etc.
(*myData)[row].setName(value.value<std::string>());
// here I end up with ""
}
QVariant TestItemListModel::data(const QModelIndex &index, int role) const
{
// again all the checks, etc.
return QVariant::fromValue<std::string>((*myData)[row].getName());
}
我发现了一个与此类似的问题,这就是它的工作原理。我还做了提到的答案的其他事情,所以在我的 main.cpp 中我有这个:
qRegisterMetaType<std::string>("std::string");
在我的 testitemlistmodel.h 中我有这个(在 class 声明之前):
Q_DECLARE_METATYPE(std::string)
我用的是Qt5.8
编辑
我找到了此类转换的来源:http://www.qtcentre.org/threads/45922-best-way-to-extend-QVariant-to-support-std-string?p=208049#post208049。现在我才意识到它已经很老了,可能不再工作了。如果是这样,最好的方法是什么?
使用 QString
作为中位数怎么样?这有点开销,但更容易维护代码:
/* std::string to QVariant */ {
std::string source { "Hello, World!" };
QVariant destination;
destination = QString::fromStdString(source);
qDebug() << destination;
}
/* QVariant to std::string */ {
QVariant source { "Hello, World!" };
std::string destination;
destination = source.toString().toStdString();
qDebug() << destination.c_str();
}
QVariant
有一个 constructor for QString
可以从 std::string
构建并且 QVariant
对象可以转换为 QString
可以转换为 std::string
.
另一种选择是使用 QByteArray
而不是 QString
,它只是逐个字符地复制您的 std::string
而不会像 QString
那样将其转换为 Unicode :
// std::string to QVariant
myQVariant.setValue<QByteArray>(myStdString.c_str());
// std::string to QVariant
myStdString = myQVariant.value<QByteArray>().constData();
我很难将 std::string 转换为 QVariant 并将 QVariant 转换回 std::string。在这两种情况下,我都得到空值(默认 QVariant,就像它没有参数初始化一样)和空 std::string ("").
这些是我的代码的相关部分:
bool TestItemListModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
// processing of other function arguments, checks, etc.
(*myData)[row].setName(value.value<std::string>());
// here I end up with ""
}
QVariant TestItemListModel::data(const QModelIndex &index, int role) const
{
// again all the checks, etc.
return QVariant::fromValue<std::string>((*myData)[row].getName());
}
我发现了一个与此类似的问题,这就是它的工作原理。我还做了提到的答案的其他事情,所以在我的 main.cpp 中我有这个:
qRegisterMetaType<std::string>("std::string");
在我的 testitemlistmodel.h 中我有这个(在 class 声明之前):
Q_DECLARE_METATYPE(std::string)
我用的是Qt5.8
编辑
我找到了此类转换的来源:http://www.qtcentre.org/threads/45922-best-way-to-extend-QVariant-to-support-std-string?p=208049#post208049。现在我才意识到它已经很老了,可能不再工作了。如果是这样,最好的方法是什么?
使用 QString
作为中位数怎么样?这有点开销,但更容易维护代码:
/* std::string to QVariant */ {
std::string source { "Hello, World!" };
QVariant destination;
destination = QString::fromStdString(source);
qDebug() << destination;
}
/* QVariant to std::string */ {
QVariant source { "Hello, World!" };
std::string destination;
destination = source.toString().toStdString();
qDebug() << destination.c_str();
}
QVariant
有一个 constructor for QString
可以从 std::string
构建并且 QVariant
对象可以转换为 QString
可以转换为 std::string
.
另一种选择是使用 QByteArray
而不是 QString
,它只是逐个字符地复制您的 std::string
而不会像 QString
那样将其转换为 Unicode :
// std::string to QVariant
myQVariant.setValue<QByteArray>(myStdString.c_str());
// std::string to QVariant
myStdString = myQVariant.value<QByteArray>().constData();