Перетаскивание из QToolBar в QGraphicsView не работает должным образом

Я работаю над проектом, используя Qt C++ , у меня есть QToolBar который содержит некоторые QButtons (читать как QAction) и QGraphicsView (вся нижняя часть).
Похоже на это.

введите описание изображения здесь

Теперь я хочу перетащить QButton (читать как QAction) от QToolBar в центральное окно (которое на самом деле QGraphicsView) моего приложения.

До сих пор я написал следующее SLOT для соответствующего QAction чтобы включить перетаскивание.

/* Send_Message is one of the actions */
void CTestBuilderApp::on_actionSend_Message_triggered()
{
QByteArray itemData;
QDataStream dataStream(&itemData, QIODevice::WriteOnly);
emit selectionState(None);

dataStream << "Send Message";

QMimeData *mimeData = new QMimeData;
mimeData->setData("application/x-dnditemdata", itemData);

QDrag *drag = new QDrag(this);
drag->setMimeData(mimeData);
drag->setPixmap(ui->ToolBox->actions().at->icon().pixmap(48,48));
drag->exec(Qt::CopyAction, Qt::CopyAction);
qDebug()<<"drag complete";
}

Но, как это SLOT вызывается только когда я clickна QActionЯ не получаю должного эффекта Drag and Drop. Когда я нажимаю кнопку, только тогда начинается перетаскивание. Один клик на QAction а затем еще один клик по QGraphicsView делает работу, но это не то, что должно быть для перетаскивания & понижаться. Это не начинается с нажатия, а затем перетаскивания.

Есть ли выход, чтобы этот код работал? Я ищу некоторые SLOT что звонят, как только я нажимаю на QAction то есть он не ждет, пока будет работать Mouse Release.

0

Решение

Вы должны реализовать слоты QGraphicsView (поэтому вам нужно создать подклассы):

void GraphicsView::dragEnterEvent(QDragEnterEvent *p_event)
{
p_event->acceptProposedAction();
}

void GraphicsView::dragMoveEvent(QDragMoveEvent *p_event)
{
p_event->acceptProposedAction();
}

void GraphicsView::dropEvent(QDropEvent *p_event)
{
p_event->acceptProposedAction();
}

В вашем конструкторе QGraphicsView вы должны принять капли:

setAcceptDrops(true);

Во всех слотах вы должны принять действие, чтобы разрешить поток:

enter -> move -> drop
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]