Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
拖动结束时未调用QTableView mouseRelease事件,错误?_Qt_Mouseevent_Qtableview - Fatal编程技术网

拖动结束时未调用QTableView mouseRelease事件,错误?

拖动结束时未调用QTableView mouseRelease事件,错误?,qt,mouseevent,qtableview,Qt,Mouseevent,Qtableview,我只想捕获用户从QTableView拖动项目并释放左按钮时的mouseRelease事件。 我想在我的应用程序中突出显示可能的放置区域,比如更改小部件的背景。 我首先通过重新实现来检测拖动启动: void LibraryTableView::startDrag( Qt::DropActions supportedActions ) { m_dragReleased = false; emit dragStart(); QTableView::startDrag(suppo

我只想捕获用户从QTableView拖动项目并释放左按钮时的mouseRelease事件。

我想在我的应用程序中突出显示可能的放置区域,比如更改小部件的背景。 我首先通过重新实现来检测拖动启动:

void LibraryTableView::startDrag( Qt::DropActions supportedActions )
{
    m_dragReleased = false;
    emit dragStart();
    QTableView::startDrag(supportedActions);
}
发出我自己的信号

现在dropzone已经更改,无论拖放是否成功,我都需要捕捉释放事件,像以前一样重新绘制dropzone

我尝试了不同的模型,重新实现了4个鼠标事件和eventFilter,但是鼠标释放事件从未被捕获

这是我的密码:

void LibraryTableView::mouseDoubleClickEvent( QMouseEvent* event )
{
    QTableView::mouseDoubleClickEvent(event);
}

void LibraryTableView::mouseMoveEvent( QMouseEvent* event )
{
    qDebug() << "move";
    QTableView::mouseMoveEvent(event);
}

void LibraryTableView::mousePressEvent( QMouseEvent* event )
{
    qDebug() << "press";
    QTableView::mousePressEvent(event);
}

void LibraryTableView::mouseReleaseEvent( QMouseEvent* event )
{
    qDebug() << "real"; // Never called when drag ends ...
    QTableView::mouseReleaseEvent(event);
}
void LibraryTableView::mouseDoubleClickEvent(QMouseEvent*事件)
{
QTableView::mouseDoubleClickEvent(事件);
}
void LibraryTableView::mouseMoveEvent(QMouseEvent*事件)
{

qDebug()对于
QTableView
您必须重新实现三个功能以支持dnd:

  • void dragEnterEvent(QDragEnterEvent*event)
    -在此函数中,鼠标进入小部件
  • void QAbstractItemView::dragMoveEvent(QdFragmoveEvent*event)
    -在此函数中,您可以更新放置区域高亮显示
  • void qabstractemview::dropEvent(qdropent*event)
    -在此函数中,您可以决定是否接受事件

我遇到了类似的问题,并且不高兴地发现MouseReleaseEvent没有在拖动结束时被触发

我只是使用了DragLeaveEvent并关闭了我的变量,就像我在MouseReleaseEvent中所做的那样。如果用户拖出应用程序,然后重新打开,那些先前关闭的变量将在DragMoveEvent中重新启用(假设它被接受)


至少这是我的诀窍。希望它能有所帮助。

自从这个问题被问到三年后,这个Qt问题仍然存在于Qt 5.4中。最近我遇到了同样的问题:从应用程序外部掉下来,没有MouseReleaseEvent。解决方案很简单,不是真正的诀窍:

启动拖放的mousePressEvent如下所示(简化):


诀窍很简单:drag->exec()启动自己的事件循环,当松开鼠标按钮时退出。drag->exec();之后的鼠标位置可以用QCursor确定。

如上所述,已经三年了,但感谢上一个答案,我找到了一个更容易解决这个问题的方法

void LibraryTableView::startDrag( Qt::DropActions supportedActions )
{
    m_dragReleased = false;
    emit dragStart();
    QTableView::startDrag(supportedActions);

    //CODE HERE WILL BE EXECUTED ONLY WHEN THE MOUSE BUTTON HAS
    //BEEN RELEASED SO YOU CAN DO THE FOLLOWING
    emit dragStop();
}

Drop事件发生在表视图之外?然后鼠标释放被“捕获”在该小部件上。删除发生在另一个小部件上,QTableView是Dragonly。在这种情况下,
dropEvent
应该在发生删除的小部件中重新实现。如果用户从我的应用程序中删除了一个元素,我仍然希望捕获鼠标释放……无论小部件是否接受删除。
void LibraryTableView::startDrag( Qt::DropActions supportedActions )
{
    m_dragReleased = false;
    emit dragStart();
    QTableView::startDrag(supportedActions);

    //CODE HERE WILL BE EXECUTED ONLY WHEN THE MOUSE BUTTON HAS
    //BEEN RELEASED SO YOU CAN DO THE FOLLOWING
    emit dragStop();
}