在我的Qt应用程序中,我想将指向对象的指针编码为字符串,将其传递给另一段代码,然后对其进行解码,以便我可以访问该对象。
这是使用QTreeView进行内部拖放的一部分。在我的mimeData()方法中,我有:
QMimeData * TreeModel::mimeData(const QModelIndexList &indexes) const
{
QMimeData *mimeData = new QMimeData();
QByteArray encodedData;
QDataStream stream(&encodedData, QIODevice::WriteOnly);
foreach (QModelIndex index, indexes)
{
QString colText;
if (index.isValid()) {
TreeItem *item = getItem(index);
// grab the text from each column
for(int cc=0; cc < item->columnCount(); cc++ ) {
colText = item->data(cc).toString();
stream << colText;
}
// add the pointer to the item
qDebug() << quint64(&item);
stream << quint64(&item);
}
}
mimeData->setData("application/vnd.text.list", encodedData);
return mimeData;
}
qDebug()行产生的数字如140736277471632,这可能是正确的,但可能是错误的。
我应该如何将指针编码为字符串,以便将其输入流中。那么我应该如何解码它并获得指向原始对象的指针?
谢谢。
答案 0 :(得分:4)
我会劝告这样做。 在字符串中序列化对象并在以后进行反序列化对于&#34;移动&#34;对象从一个进程到另一个进程。但是在一个进程中,你应该直接传递指针,或者包装在像shared-pointer这样的容器中。
如果传递内容的唯一方法是字符串,则创建一个实例(例如QMap<QString, YourPointerType>
),您可以在其中注册指针并通过字符串名称访问它。
如果你将这个地图包装在一个类中,你可以检查,如果这个指针在注册时已经存在,并且在检索时它是否仍然存在。
此外,在模型中,您可以使用用户角色存储任何所需内容。您不限于将自定义数据存储为mime数据。
答案 1 :(得分:3)
在这里,您不想取item
的地址,而是取其值。它是一个指针,它的值是你要查找的地址,而不是它的地址(正如已经提到的那样,一旦退出if块作用域,它就完全无关紧要并且操作起来很危险。)
qDebug << qint64(&item);// will print the address this pointer is stored at.
qDebug << qint64(item);// will print the address this pointer is pointing at
编辑:如果你想将字符串中的地址变回指针,请从字符串流中读取数字,即:
std::istringstream is{str};
long pointer;//be careful with the size of a pointer in your case.
is >> pointer;
TreeItem* item = reinterpret_cast<TreeItem*>(q);