Я работаю над проектом, используя Qt C++
, у меня есть QToolBar
который содержит некоторые QButton
s (читать как 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.
Вы должны реализовать слоты 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
Других решений пока нет …