从QToolBar拖放到QGraphicsView无法按预期工作

时间:2017-03-05 09:13:41

标签: c++ qt drag-and-drop qgraphicsview qtoolbar

我正在使用Qt C++开展项目。我有一个QToolBar,其中包含一些QButton s(读作QAction)和QGraphicsView(整个底部)。 它看起来像这样。

enter image description here

现在,我想将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就会调用它,即它不会等待鼠标释放工作。

1 个答案:

答案 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