2016-10-12 15 views
2

我有一个执行两个动作的QPushButton。每次调用按钮的按下槽时都应该发生一个动作,包括通过autoRepeat进行的调用。第二个动作应该在第一次按下按钮时开始执行,并且只有当用户不再持有时才结束。如何确定QPushButton的释放信号是自动重复还是实际鼠标释放的结果

问题是autoRepeat触发按钮的按下,释放和点击信号。这会导致第二个动作结束并在每次重复时重新开始,而不是持续按钮持续的时间。如何确定按钮是否仅由用户使用现有的按下和释放插槽实际释放?

示例代码:

void MyClass::on_button_pressed() 
{ 
    startHeldAction(); 
    doRepeatedAction(); 
} 

void MyClass::on_button_released() 
{ 
    stopHeldAction(); 
} 

回答

0

我发现,采取以下步骤提供一个相对简单的解决方案,它不需要任何附加的事件处理:

  1. 创建bool类型的类成员isHeld那默认为false。
  2. 在按下的槽内,检查isHeld。如果if为false,则将isHeld设置为true并致电startHeldAction()
  3. 在发布的插槽中,检查按钮的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。