Qt我想将指针编码为字符串并稍后解码

时间:2015-04-21 09:43:32

标签: c++ qt

在我的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,这可能是正确的,但可能是错误的。

我应该如何将指针编码为字符串,以便将其输入流中。那么我应该如何解码它并获得指向原始对象的指针?

谢谢。

2 个答案:

答案 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);