QPushButton:如何知道“释放”信号是不是会跟随“点击”信号?

Posted

技术标签:

【中文标题】QPushButton:如何知道“释放”信号是不是会跟随“点击”信号?【英文标题】:QPushButton: How to know whether a "released" signal will be followed by a "clicked" signal?QPushButton:如何知道“释放”信号是否会跟随“点击”信号? 【发布时间】:2016-10-28 14:57:42 【问题描述】:

在我的应用程序中,有几个QPushButtons 我需要以不同方式处理“无效释放”和“单击”。

“无效释放”是指在按钮外发生的释放(在按钮内按下之后)。

所以我尝试从QPushButton 继承并实现我自己的信号void released(bool validClick);

我正在考虑使用mouseReleaseEvent 检查它是否在按钮的rect() 中,以推断clicked() 信号是否会跟随released() 信号。这是一个好方法吗?

更新::背景:

我有一组三个按钮,每个按钮都可以向后端启动相同的操作(具有不同的配置)。但是,如果没有清理已经启动的命令,后端无法处理多个连续的启动命令,所以我必须在按钮组中防止这种情况。

这个应用程序是多点触控的,这使得同时点击所有三个按钮变得非常容易。

我想做什么:

1) 当其中一个按钮被按下时,禁用其他按钮。这是必不可少的,因为这是一个多点触控 GUI,同时单击多个按钮是我需要避免的第一件事。

2) 当后端通知按钮组之前启动的所有服务都已关闭并清理完毕并准备好单击下一个按钮时,按钮组解锁所有按钮。

3) 如果用户触发了无效释放(按下按钮,向外释放),所有按钮应立即解锁。

4)如果用户触发了有效的释放(点击),按钮组也应该禁用用户点击过的按钮,以便在后端允许之前不能再次点击。

如果我不能区分有效和无效释放,那么我将不得不以与案例 3) 相同的方式处理案例 4) 和案例 2)。这是不可取的。

【问题讨论】:

无效版本需要做什么? @ddriver 请在问题中查看我的更新。 听起来太复杂了。使用 clicked() 而不是 release() 来处理“无效释放”并处理来自被调用者内部的多个触发器。让他在完成之前拒绝任何开始。 【参考方案1】:

您不关心新闻或发布,只关心点击和任务由后端完成的指示。您有两种状态:空闲和忙碌。空闲时,按钮启用。当任何按钮为clicked() 时,您将转换为忙碌状态,直到后端发出信号表明它不再忙碌。使用状态机框架实现这一点很简单。

您还可以使用三种状态来简化故障处理:空闲、挂起和忙碌。当任何按钮为clicked() 时,您将转换到挂起状态并请求后端的工作。当后端表示它已接受请求时,转换为忙碌状态,直到后端表示它已完成对请求的处理,而您转换为空闲状态。

【讨论】:

以上是关于QPushButton:如何知道“释放”信号是不是会跟随“点击”信号?的主要内容,如果未能解决你的问题,请参考以下文章

Qt python如何知道QPushButton发送了哪些信号?

PyQt4:如何使图标大于 QPushButton? (像素图按钮)

模拟鼠标释放 Pyqt

如何实现 QPushbutton 来发出 pyqt 信号并调用另一个类?

Qt QpushButton 实现长按下功能

c++ QPushButton信号和槽