Мне трудно преобразовать 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 у меня есть это (до объявления класса):
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. Теперь я только что понял, что он довольно старый и может больше не работать. Если это так, то как лучше всего это сделать?
std::string
(что обычно зависит от платформы). - person MrEricSir   schedule 26.06.2017ItemsModel
, полученная изQAbstractListModel
при поддержкеstd::vector<T>
, гдеT
содержит несколько членовstd::string
. преобразование делается вItemsModel::data(...)
[std::string -> QVariant
], но что с ними происходит я не знаю.QVariant -> std::string
выполняется вItemsModel::setData(...)
, аQVariant
здесь передается по константной ссылке. К сожалению, я не знаю, как это работает внутри, поэтому я не могу больше ничего сказать о том, как это используется экземпляромQListView
, привязанным к этой модели. - person pzaj   schedule 26.06.2017QSstring
илиQByteArray
в качестве медианного типа) работают, как и ожидалось. Я предполагаю, что это как-то связано либо с макросомqRegisterMetaType
, либо с макросомQ_DECLARE_METATYPE
. Вместо этого я решил использовать QByteArray, который, похоже, отлично работает и обеспечивает надежность, которую я не могу воспроизвести с моим решением, опубликованным здесь. - person pzaj   schedule 26.06.2017