Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我想把指针编码成字符串,以后再解码_C++_Qt - Fatal编程技术网

C++ 我想把指针编码成字符串,以后再解码

C++ 我想把指针编码成字符串,以后再解码,c++,qt,C++,Qt,在我的Qt应用程序中,我想将指向对象的指针编码为字符串,将其传递给另一位代码,然后对其进行解码,以便访问该对象 这是QTreeView内部拖放的一部分。在我的mimeData()方法中,我有: QMimeData * TreeModel::mimeData(const QModelIndexList &indexes) const { QMimeData *mimeData = new QMimeData(); QByteArray encodedData; Q

在我的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;
}
QMimeData*TreeModel::mimeData(常量QModelIndexList&index)常量
{
QMimeData*mimeData=新QMimeData();
QByteArray编码数据;
QDataStream流(&encodedData,QIODevice::WriteOnly);
foreach(QModelIndex索引,索引)
{
QString colText;
if(index.isValid()){
TreeItem*item=getItem(索引);
//从每列抓取文本
对于(int cc=0;cccolumnCount();cc++){
colText=item->data(cc.toString();

stream这里您不想获取
项的地址,而是它的值。它是一个指针,它的是您要查找的地址,而不是它的地址(如前所述,一旦退出if块作用域,它就完全不相关,操作起来很危险)

qDebug指针;
TreeItem*项目=重新解释铸造(q);

我不建议这样做。 在字符串中序列化对象并在以后反序列化对于将对象从一个进程“移动”到另一个进程是有意义的。但是在一个进程中,您应该直接传递指针,或者封装在类似共享指针的容器中

如果传递某个内容的唯一方法是字符串,请创建一个实例(例如,
QMap
),您可以在其中注册指针并通过字符串名称访问它

如果将此映射包装在类中,则可以检查此指针在注册时是否已存在,以及在检索时是否仍然存在


此外,在模型中,您可以使用用户角色存储任何您想要的内容。您不限于将自定义数据存储为mime数据。

您认为这是错误的原因是什么?您到底有什么问题?这可能不是您要查找的值,因为
item
是一个局部变量。它的地址(
&item
)在其生命周期结束时将变得不可用。它也是指向
TreeItem
的指针的地址,听起来不是很有用。您对
item
是否更感兴趣,它是指向
TreeItem
的指针?我不会存储树项的指针,而是它的树路径(字符串)。它可用于在执行拖放操作时查找树项。@Mat-我认为这是错误的,因为当我拖放另一项时,我得到的数字与指针的地址(即堆栈位置)相同谢谢你,JBL,这是有道理的。谢谢,JBL——这正是我所需要的。虽然这是可行的,但也要考虑“瓦伦丁海尼茨”的回答。通常你不应该直接处理记忆,更不用说生草稿了。是的,我已经考虑过了。Valentin@s答:我已经花了很长时间试图从mimeData()那里得到一个指针在QAbstractItemModel中dropMimeDate()没有成功。我已经成功地传递了一个字符串列表-添加一个包含我想要的指针的字符串似乎很容易,并且不会超出dropMimeData()方法,因此,在这种情况下,似乎是一个合理但不完美的解决方案。我感谢您的“建议”在这一点上,瓦伦丁。我花了相当多的时间试图找到一个“适当”的解决方案,但没有成功。因为我能够并且已经将一个字符串列表从mimeData()发送到dropMimeData(),我所问的方法似乎可以接受,但不完美。再次感谢您的回答。
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);