我正在使用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
时被调用,所以我没有得到拖放的正确效果。当我单击按钮时,只有拖动才开始。点击QAction
,然后点击QGraphicsView
即可完成这项工作,但这不是它应该用于拖动&amp;下降。它不会在按下然后拖动时开始。
有没有办法让这段代码有效?我正在搜索一些SLOT
,只要我按下QAction
就会调用它,即它不会等待鼠标释放工作。
答案 0 :(得分: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构造函数中,你必须接受drop:
setAcceptDrops(true);
在所有插槽中,您必须接受允许流动的操作:
enter -> move -> drop