拖动结束时未调用QTableView mouseRelease事件,错误?
我只想捕获用户从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
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();
}