gpt4 book ai didi

qt - 如果鼠标在鼠标释放前没有移动,则在 Qt 5 中获取鼠标放置事件

转载 作者:行者123 更新时间:2023-12-03 17:51:54 29 4
gpt4 key购买 nike

Qt 5 中的某些内容似乎发生了变化:如果从 QDrag::exec() 时所在的起点开始不移动至少一个像素,则无法获得放置或移动事件。被称为。尝试在 dropEvent 中放置一个断点的Draggable Icons Sample ,然后单击一条船并在不移动鼠标的情况下释放它。这会产生一个“忽略”而没有任何下降信号。

(这是在带有 Qt 5.1 的 Kubuntu 13.10 上。)

在教授如何开始拖动操作时,文档建议您可以使用 manhattanDistance()以确定鼠标是否移动到足以真正符合“打算开始拖动的用户”的条件。但是您不必使用它;您可以在单击本身上启动 QDrag。

任何人都知道在下降方面有相同选择的解决方法,还是该选择完全消失了? :-/

我为什么关心:长期以来,我一直在尝试严格控制 GUI 应用程序(包括 Qt)中的鼠标行为时遇到挫折。似乎没有可信赖的状态转换图可以绘制不变量。这是一个纸牌屋,您可以通过简单的测试轻松反驳,例如:

virtual void enterEvent(QEvent * event) {
Q_ASSERT(!_entered);
_entered = true;
}

virtual void leaveEvent(QEvent * event) {
Q_ASSERT(_entered);
_entered = false;
}

这打破了各种方式,如何打破取决于平台。 (目前我将讨论带有 Qt 5.1 的 Kubuntu 13.10。)如果您按下鼠标按钮并拖出小部件,您将在越过边界时收到一个 leaveEvent...然后在按钮时收到另一个 leaveEvent被释放。如果您离开窗口并在屏幕上的窗口中激活另一个应用程序,然后在小部件内部单击以重新激活 Qt 应用程序,您将获得两个连续的 enterEvents。

对每个鼠标事件重复此模式,并尝试牢牢捕获不变量......祝你好运!将这些固定在一个“知道”它的状态并且不会崩溃的防弹应用程序中(尤其是在面对疯狂点击和 alt-Tabbing 时)有点失败。

如果您的程序进行分配和处理繁重,并且不想在地毯下进行大量清理(例如“哦,我正在做一些处理以响应输入......但我只是没有离开就再次进入。嗯,我想这会发生!扔掉当前的计算并重新开始......”)

过去我所做的是通过拖放处​​理我所有的鼠标操作(甚至是简单的点击)。让操作系统拖放设施参与操作往往会产生更强大的体验。我只能假设这是因为测试人员实际上必须考虑使用 alt-Tab 进行任务切换等问题,而不是导致多次删除操作或只是忘记操作已经开始。

但是“在比框架更深的层次上进行烘焙”方面实际上使这种单像素移动的要求无法改变。我试图通过设置一个计时器事件来绕过它,然后在拖动生效后伪造一个 QMouseEvent 将光标移动到一个新位置。但是,我推测拖放是在平台层面 Hook 的,并没有查询普通的Qt事件队列: src/plugins/platforms/xcb/qxcbdrag.cpp

最佳答案

该问题已于 2014 年 5 月 1 日被 Qt 团队确认为错误:

https://bugreports.qt-project.org/browse/QTBUG-34331

似乎我在这里赏金它终于引起了他们的注意,尽管它没有产生任何我可以接受的 SO 答案来完成这个问题。所以我正在写作并接受我自己的。干得好,我。 (?) 抱歉没有更好的答案。 :-/

“Dmitry Mordvinov”指出,Qt5 更改还有另一个不幸的副作用:

Same problem here. Additionally app events are not handled till the first mouse event after drag started and this is really nasty bug. For example all app animations are suspended during that moment or application hangs up when you try to drag with touch monitor.



@dvvrd 不得不解决这个问题,但觉得这个解决方法太难看了,无法分享。因此,似乎如果您受到问题的影响,正确的做法是权衡……并将您的声音添加到问题跟踪器中,以提高解决方案的优先级。

(或者更好:打补丁并提交补丁。毕竟是开源的......)

关于qt - 如果鼠标在鼠标释放前没有移动,则在 Qt 5 中获取鼠标放置事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19498385/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com