【发布时间】:2014-10-29 03:39:58
【问题描述】:
我正在尝试创建一个可拆卸的类型样式小部件,就像 Chrome 选项卡可拆卸的方式一样(类称为 Tab)。我一切正常,除了一个错误,有时(可能 50% 的时间)Tab 对象永远不会获得鼠标释放事件,并且停止获得鼠标移动事件。
基本上,分离系统的工作原理是允许在鼠标按下/移动/释放功能中进行拖动,就像正常情况一样。 mouseMoveEvent 检查从开始移动的总距离,如果超过一定量,将开始“分离”过程。分离过程涉及将父小部件设置为 0(顶级小部件,未装饰的窗口),因此 Tab 对象几乎漂浮在鼠标下方的所有内容之上,并继续与它一起拖动直到释放。
我浏览了所有正在交付的QEvent 项目,我发现当这个问题发生时,QEvent::MouseMove 项目(以及之后的所有鼠标事件)被发送到 TabBar(Tab 对象的原始父项) )。这在选项卡上调用setParent(0) 后直接发生。
基本鼠标处理概述:
void Tab::mousePressEvent(*) {
[set up some boolean, start positions, etc]
}
void Tab::mouseMoveEvent(*) {
[track the updated position]
if (positionChange > STATIC_AMOUNT)
detachTab();
}
void Tab::mouseReleaseEvent(*) {
[return the Tab to its original position, and set the parent back to the TabBar]
}
void Tab::detachTab() {
QPoint mappedPos = mapToGlobal(0, 0);
setParent(0); //The loss of MouseMove events occurs when this returns.
move(mappedPos);
show();
raise();
}
这里是Tab对象接收到的事件(第一行是QEvent类型,第二行是名字)
[Tab::detachTab() started]
[setParent(0) started]
QEvent::Hide
QEvent::Leave
qApp QEvent::MouseMove [ TabBar ] <-- now the TabBar is soaking up the mouse events
QEvent::HideToParent
QEvent::ParentAboutToChange
QEvent::ParentChange
[setParent(0) returned]
....
总结:我的可拖动 QWidget 在其父级设置为 0 后丢失了 QEvent::MouseMove 和 QEvent::MouseButtonRelease 事件。
任何建议将不胜感激!
【问题讨论】:
-
可能需要直接使用
grabMouse方法。但是我不确定当你删除一个小部件时抓取是否会被释放。