Change mouse icon on Macwhen performing a Drag Drop
-
Hi,
Are you creating the QDrag object yourself ?
-
@jpalbertini
Could you show us your code please? Or better, provide a minimal code to reproduce this behavior. -
@jpalbertini said:
I try to reproduce the behavior of the OSX finder: by default it moves files/directories but press ALT while doing it and it will duplicate, showing a white "+" near the mouse cursor...
The possible drop actions are defined when creating/starting the QDrag. So may it be that you only set a single drop action there?
These drop actions can then be chosen by the user by pressing the modifier keys on the keyboard during the drag.
Additionally the target widget also can force a specific drop target to be set once you drag over it. -
@ValentinMichelet
the drag is done this wayQDrag * drag = new QDrag(parentWidget()); drag->start(Qt::CopyAction | Qt::MoveAction);
Then the drop is here in the dragMoveEvent
if (event->keyboardModifiers() == modifier) event->setDropAction(Qt::MoveAction); else event->setDropAction(Qt::IgnoreAction);
Nothing else is tempering with the event...
-
Can you share the complete implementation ?
-
@SGaist
not all but here is most of it:Here ifs the code where we start the D&D operation:
void QButtonSceneEditor::mouseMoveEvent(QMouseEvent* event) { m_bIsMousePressProcessed = false; if(isChecked()) { if(!visibleRegion().contains(event->localPos().toPoint()) && event->buttons().testFlag(Qt::LeftButton)) { dragDropManager()->addSceneButton(this); QMimeData * mimeData = new QMimeData(); mimeData->setData(DVC_SCENE_MIME_DATA, 0); QDrag * drag = new QDrag(parentWidget()); drag->setMimeData(mimeData); drag->start(Qt::CopyAction | Qt::MoveAction); } } }
It's an custom button we want to move internally into its parent
void QSceneGroupEditor::dragMoveEvent(QDragMoveEvent * event) { if (!event->mimeData()->hasFormat(DVC_SCENE_MIME_DATA)) { event->ignore(); return; } QButtonScene* pScene = sceneAt(event->pos().x(), event->pos().y()); if (pScene) { bool bInTop = event->pos().y() <= pScene->geometry().center().y(); int iHover = m_lSceneButtons.indexOf(pScene); for (int iDragged(0); iDragged < dragDropManager()->sceneButtonCount(); iDragged++) { QButtonScene* pButton = dragDropManager()->sceneButtonAt(iDragged); if (pButton) { int iButton = m_lSceneButtons.indexOf(pButton); if (m_lSceneButtons.contains(pButton)) { if (iHover == iButton || (bInTop && iHover == iButton + 1) || (!bInTop && iHover == iButton - 1)) { m_pLblSeparator->hide(); return; } m_pLblSeparator->show(); if (bInTop) m_pLblSeparator->move(pScene->pos().x() - 8, pScene->pos().y() - 8); else m_pLblSeparator->move(pScene->pos().x() - 8, pScene->pos().y() + pScene->geometry().height() - 3); } else { m_pLblSeparator->show(); if (bInTop) m_pLblSeparator->move(pScene->pos().x() - 8, pScene->pos().y() - 8); else m_pLblSeparator->move(pScene->pos().x() - 8, pScene->pos().y() + pScene->geometry().height() - 3); } } } } else m_pLblSeparator->hide(); Qt::KeyboardModifiers modifier = Qt::AltModifier; #if defined (Q_OS_MACX) if (event->keyboardModifiers() == modifier) event->setDropAction(Qt::MoveAction); else //event->setDropAction(Qt::IgnoreAction); // Works but, nothing happends... event->setDropAction(Qt::CopyAction); #endif m_pButAdd->setVisible(event->keyboardModifiers() == modifier); event->accept(); }
Unless there is something I did not understand about the D&D and/or the mouse icon management, i can't change the mouse icon unless using the Qt::IgnoreAction...
-
Hum, nobody ?
Maybe I should report a bug... -
Are you calling acceptProposedAction where appropriate ?