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