я реализовал mousePress, mouseMove и mouseRelase в QGraphicsView, и я добавил в него QGraphicsWidget и QGraphicsLayoutItem и добавил в представление.
теперь внутри GraphicsLayoutitem я реализовал
void ParentItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
m_mousePressed = true;
QGraphicsObject::mousePressEvent(event);
}
void ParentItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
if (!(event->buttons() & Qt::LeftButton))
{
QGraphicsObject::mouseMoveEvent(event);
return;
}
if( this->boundingRect().contains(event->pos()) && (m_mousePressed))
{
QGraphicsObject::mouseMoveEvent(event);
QDrag *drag = new QDrag(this);
QMimeData *mimeData = new QMimeData;
// mime stuff
mimeData->setText("Parent");
drag->setPixmap(m_currentImage.scaled(30,30));
drag->setHotSpot(QPoint(15, 20));
drag->setMimeData(mimeData);
// start drag
drag->start(Qt::CopyAction | Qt::MoveAction);
}
поэтому, когда я mouseMove в родительском элементе, Drag успешно выполняется, и когда я бросаю элемент в сцену, graphicsView не получает событие mouseRelease. Событие mouseRelease графического представления не вызывается, когда я бросаю его на сцену.
вот как я справляюсь с падением сцены
void HandlerScene::dropEvent ( QGraphicsSceneDragDropEvent * event )
{
if (event->mimeData()->hasText()){
if(event->mimeData()->text() == "Parent")
{
//My code
}
event->acceptProposedAction();
}
Пример кода, который я загрузил в http://filesave.me/file/53135/DropItem-zip.html
Вы можете перетащить элемент, и он создаст новый элемент. Он отлично работает, но когда я даю setFocus(Qt::mouseFocusReason) элементу, начинается реальная проблема.
пользователь, дважды щелкнув текст элемента, я добавил поверх него Qgraphicstextitem. когда текстовый элемент потерял фокус, я удалил его.
В обычном состоянии без двойного щелчка по тексту элемента перетаскивание работает нормально.
но когда я добавляю QGraphicsTextItem вверху элемента и устанавливаю фокус как setFocus(Qt::mouseFocusReason), и если я снова перетаскиваю элемент, событие QGraphicsView mouseMove продолжает вызываться.
QDrag::exec()
в любом случае - это полусломанный хак, я не удивлюсь, если у него будет эта проблема... - person Kuba hasn't forgotten Monica   schedule 26.03.2015