如何确定QPushButton的释放信号是自动重复还是实际鼠标释放的结果
问题描述:
我有一个执行两个动作的QPushButton。每次调用按钮的按下槽时都应该发生一个动作,包括通过autoRepeat进行的调用。第二个动作应该在第一次按下按钮时开始执行,并且只有当用户不再持有时才结束。如何确定QPushButton的释放信号是自动重复还是实际鼠标释放的结果
问题是autoRepeat触发按钮的按下,释放和点击信号。这会导致第二个动作结束并在每次重复时重新开始,而不是持续按钮持续的时间。如何确定按钮是否仅由用户使用现有的按下和释放插槽实际释放?
示例代码:
void MyClass::on_button_pressed()
{
startHeldAction();
doRepeatedAction();
}
void MyClass::on_button_released()
{
stopHeldAction();
}
答
我发现,采取以下步骤提供一个相对简单的解决方案,它不需要任何附加的事件处理:
- 创建bool类型的类成员
isHeld
那默认为false。 - 在按下的槽内,检查
isHeld
。如果if为false,则将isHeld
设置为true并致电startHeldAction()
。 - 在发布的插槽中,检查按钮的down property。如果它是假的,则将isHeld设置为false,并致电
stopHeldAction()
。
进行这些更改产生以下代码:
void MyClass::on_button_pressed()
{
if(!isHeld)
{
isHeld = true;
startHeldAction();
}
doRepeatedAction();
}
void MyClass::on_button_released()
{
if(!ui->button->isDown())
{
isHeld = false;
stopHeldAction();
}
}
这工作,因为isDown()
将在发布插槽,除非用户实际已经释放了鼠标按键返回true。