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();