との小さなインターフェースを実装していますQt
。現在取り組んでいるステップでは、スコア (カスタム クラス) があり、スコアを 1 つだけ保持できるドック (カスタム クラス) に移動できます。
私はこの例で (たくさん) インスピレーションを得ました:冷蔵庫のマグネット.
この構成では、ドラッグされたオブジェクトの情報は、QByteArray
によるシリアル化のおかげで、MIME データにストックされている のおかげで持ち込まれ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();
}
<< と >> 演算子をQDataStream
and Dock * でオーバーロードすることはできませんでした。これは、ポインターを使用してそれを行う唯一の方法が、実際のデータをストックすることだったからです。しかし問題は、私はデータが欲しくないということです。文字通りポインターが必要なだけです!
アイデアがあれば、これを行う方法を再考しなければならないとしても、喜んでお聞きします. ありがとうございました!