【问题标题】:How to determine if a QPushButton's released signal is the result of auto repeat or an actual mouse release如何确定 QPushButton 的释放信号是自动重复的结果还是实际的鼠标释放
【发布时间】:2016-10-12 15:50:53
【问题描述】:

我有一个执行两个操作的 QPushButton。每次调用按钮的按下槽时都应执行一项操作,包括通过 autoRepeat 进行的调用。第二个动作应该在第一次按下按钮时开始执行,并且仅在用户不再按住按钮时结束。

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

示例代码:

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

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

【问题讨论】:

    标签: c++ qt qwidget


    【解决方案1】:

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

    1. 创建一个默认为 false 的 bool 类型的类成员 isHeld
    2. 在按下的插槽内,检查isHeld。如果 if 为 false,则将 isHeld 设置为 true 并调用 startHeldAction()
    3. 在已释放的插槽中,检查按钮的down property。如果为 false,则将 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,除非用户实际释放了鼠标按钮。

    【讨论】:

      猜你喜欢
      • 2011-05-08
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 2011-12-15
      • 1970-01-01
      • 2011-11-09
      • 2011-07-01
      • 1970-01-01
      相关资源
      最近更新 更多