QDataStream序列化指针

时间:2014-06-21 20:40:18

标签: c++ qt qdatastream

我正在使用Qt实现一个小接口。在我目前正在进行的步骤中,我有分数(自定义类)我可以在Docks(再次,自定义类)上移动,只能持有一个分数。

我用这个例子激励了自己(很多):Fridge magnets 在此配置中,由于QByteArray存储了m QDataStream,由于/* Part of the definition of my classes */ class Score : public QLabel { Q_OBJECT protected: QString labelText; Dock * dock; QImage * click; }; class Dock : public QFrame { Q_OBJECT protected: Score * score; }; /* And the 4 methods allowing the drag and drop */ void Dock::mousePressEvent(QMouseEvent *event) { Score * child = dynamic_cast<Score *>(childAt(event->pos())); if (!child) return; QPoint hotSpot = event->pos() - child->pos(); QByteArray itemData; QDataStream dataStream(&itemData, QIODevice::WriteOnly); dataStream << child->getLabelText() << child->getClick() << QPoint(hotSpot); QMimeData *mimeData = new QMimeData; mimeData->setData("application/x-score", itemData); mimeData->setText(child->getLabelText()); QDrag *drag = new QDrag(this); drag->setMimeData(mimeData); drag->setPixmap(QPixmap::fromImage(*child->getClick())); drag->setHotSpot(hotSpot); child->hide(); if (drag->exec(Qt::MoveAction) == Qt::MoveAction) child->close(); else child->show(); } void Dock::dragEnterEvent(QDragEnterEvent *event) { if (event->mimeData()->hasFormat("application/x-score")) { if (children().contains(event->source())) { event->setDropAction(Qt::MoveAction); event->accept(); } else event->acceptProposedAction(); } else event->ignore(); } void Dock::dragMoveEvent(QDragMoveEvent *event) { if (event->mimeData()->hasFormat("application/x-score")) { if (children().contains(event->source())) { event->setDropAction(Qt::MoveAction); event->accept(); } else event->acceptProposedAction(); } else event->ignore(); } void Dock::dropEvent(QDropEvent *event) { if (event->mimeData()->hasFormat("application/x-score")) { const QMimeData *mime = event->mimeData(); QByteArray itemData = mime->data("application/x-score"); QDataStream dataStream(&itemData, QIODevice::ReadOnly); QString text; QImage * img; QPoint offset; dataStream >> text >> img >> offset; Score * newScore = new Score(text, this); newScore->show(); newScore->setAttribute(Qt::WA_DeleteOnClose); if (event->source() == this) { event->setDropAction(Qt::MoveAction); event->accept(); } else event->acceptProposedAction(); } else event->ignore(); static_cast<FrameCC *>(parentWidget())->calcTotal(); } 的序列化,因此拖动了对象的信息。

我希望获得一个分数,当被丢弃在一个被占用的码头上时,让#34;居住&#34;得分去他原来的空间。我认为我可以通过包含其原始Dock的地址的属性来做到这一点,但我无法在数据流中存储此指针。

以下是我的部分代码:

QDataStream

我无法超载&lt;&lt;和&gt;&gt; {{1}}和Dock *的运算符,因为我发现用指针执行此操作的唯一方法是存储实际数据。但问题是我不想要数据,我只需要指针!

我有一个想法,即使这意味着我必须重新考虑这样做的方式,我很乐意听到它。谢谢!

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您想要将指针序列化到码头吗?我真的不明白你为什么这么做。

这个怎么样:

  • 让您的mime-data简单地指向分数itemData.fromRawData(reinterpret_cast<char*>(&score, sizeof(Score*)));
  • dropEvent()中的
    • 使用event-&gt; source()获取dock的指针
    • 使用另一个流和相反的过程从mimeData中提取指针,或者只是一个超级联盟: union {char chr[8]; Score *score} scorecast; memcpy(scorecast.chr, itemData.data(), sizeof(Score*)); ,然后通过scorecast.score
    • 访问您的分数指针

这也可以帮助您避免发送分数中的所有数据...

最后一个想法:QByteArray.data()为构成指针的数据提供了一个const char *。那么* reinterpret_cast&lt;得分* *&gt;(imageData.data())如何让你的指针回来?

还有第二个,但我还是读了我自己的QDataStream编组代码:

QDataStream & operator << (QDataStream & s, const Score * scoreptr)
{
    qulonglong ptrval(*reinterpret_cast<qulonglong *>(&scoreptr));
    return s << ptrval;
}
QDataStream & operator >> (QDataStream & s, Score *& scoreptr)
{
    qulonglong ptrval;
    s >> ptrval;
    scoreptr = *reinterpret_cast<Score **>(&ptrval);
    return s;
}