1

我正在使用Qt C++. 我有一个QToolBar包含一些QButtons (读作QAction)和 a 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仅当我在clicking 上时才调用它QAction,所以我没有得到正确的拖放效果。当我单击按钮时,才开始拖动。单击QAction然后再单击就QGraphicsView可以完成这项工作,但这不是拖放应有的效果。它不是从按下然后拖动开始的。

有没有办法让这段代码工作?我正在寻找一些SLOT在我按下QActionie 后立即被调用的内容,它不会等待鼠标释放工作。

4

1 回答 1

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
于 2017-03-06T16:09:56.540 回答