#include "imageitem.h"
#include <QPainter>
#include <QDrag>
#include <QLineF>
#include <QGraphicsSceneMouseEvent>
#include <QApplication>
#include <QMimeData>
#include <QGraphicsScene>
#include <QGraphicsSimpleTextItem>
PuzzlePartManager::PuzzlePartManager(QGraphicsScene *scene)
: m_scene(scene)
{
}
void PuzzlePartManager::addSourceItems(int partId, PuzzleImageItem *item)
{
m_sourceItems.insert(partId, item);
}
void PuzzlePartManager::removeItem(int partId)
{
QMap<int, PuzzleImageItem*>::iterator it = m_sourceItems.find(partId);
if(it != m_sourceItems.end())
{
PuzzleImageItem *item = it.value();
m_sourceItems.remove(partId);
m_scene->removeItem(dynamic_cast<QGraphicsItem*>(item));
item->deleteLater();
}
if(m_sourceItems.size() == 0)
{
QGraphicsSimpleTextItem *info = new QGraphicsSimpleTextItem("Congratulations!");
info->setPen(QPen(Qt::blue));
info->setPos(10, 10);
QFont font = qApp->font();
font.setPointSize(16);
info->setFont(font);
m_scene->addItem(info);
}
}
//
// class PuzzleImageItem
//
PuzzleImageItem::PuzzleImageItem(const QString & imagePath, int w,
int h, int partId)
: m_image(imagePath)
, m_width(w)
, m_height(h)
, m_partId(partId)
{
setCursor(Qt::OpenHandCursor);
setAcceptedMouseButtons(Qt::LeftButton);
}
QRectF PuzzleImageItem::boundingRect() const
{
return QRectF(0, 0, m_width, m_height);
}
void PuzzleImageItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
Q_UNUSED(option);
Q_UNUSED(widget);
painter->drawImage(0, 0, m_image);
}
void PuzzleImageItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
setCursor(Qt::ClosedHandCursor);
}
void PuzzleImageItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
if (QLineF(event->screenPos(), event->buttonDownScreenPos(Qt::LeftButton))
.length() < QApplication::startDragDistance()) {
return;
}
QDrag *drag = new QDrag((QObject*)event->widget());
QMimeData *mime = new QMimeData;
mime->setImageData(m_image);
mime->setData(QString(QMetaType::typeName(QMetaType::Int)), QString("%1").arg(m_partId).toLatin1());
drag->setMimeData(mime);
drag->setPixmap(QPixmap::fromImage(m_image));
drag->setHotSpot(QPoint(15, 30));
drag->exec();
setCursor(Qt::OpenHandCursor);
}
void PuzzleImageItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
setCursor(Qt::OpenHandCursor);
}
//
// class PuzzlePart
//
PuzzlePart::PuzzlePart(PuzzlePartManager *mgr, int w, int h, int partId, QGraphicsItem *parent)
: QGraphicsObject(parent)
, m_sourcePartManager(mgr)
, m_width(w)
, m_height(h)
, m_partId(partId)
, m_dragOver(false)
{
setAcceptDrops(true);
}
QRectF PuzzlePart::boundingRect() const
{
return QRectF(0, 0, m_width, m_height);
}
void PuzzlePart::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
Q_UNUSED(option)
Q_UNUSED(widget)
if(m_image.isNull())
{
painter->fillRect(boundingRect(), Qt::transparent);
}
else
{
painter->drawImage(0, 0, m_image);
}
}
void PuzzlePart::dragEnterEvent(QGraphicsSceneDragDropEvent *event)
{
const QMimeData *mime = event->mimeData();
int partId = mime->data(QMetaType::typeName(QMetaType::Int)).toInt();
if(mime->hasImage() && partId == m_partId)
{
event->setAccepted(true);
m_dragOver = true;
update();
}
else
{
event->setAccepted(false);
}
}
void PuzzlePart::dropEvent(QGraphicsSceneDragDropEvent *event)
{
m_dragOver = false;
const QMimeData *mime = event->mimeData();
int partId = mime->data(QMetaType::typeName(QMetaType::Int)).toInt();
if(mime->hasImage() && partId == m_partId)
{
m_image = qvariant_cast<QImage>(event->mimeData()->imageData());
m_sourcePartManager->removeItem(partId);
}
update();
}
void PuzzlePart::dragLeaveEvent(QGraphicsSceneDragDropEvent *event)
{
Q_UNUSED(event);
m_dragOver = false;
update();
}
- 1
- 2
前往页