【问题标题】:Qt C++11 lambda: Is this connect (signal-slot) correct?Qt C++11 lambda:这个连接(信号槽)正确吗?
【发布时间】:2016-10-22 22:40:13
【问题描述】:

我在 Windows7 上使用 Qt5(启用 C++11)。
在我的应用程序中,我有这样的东西:

connect(ui->alarm, &QCheckBox::stateChanged, [this]{
  (ui->alarm->isChecked()) ? m_timer.start() : m_timer.stop();
});

其中alarmQCheckBoxm_timerQTimer

我想根据警报复选框的状态即时启动/停止计时器。

我测试过,它似乎可以工作,但我不确定它是否 100% 可以......或者是否有更好的 lambda 来做它

【问题讨论】:

    标签: qt c++11 lambda signals-slots


    【解决方案1】:
    connect(ui->alarm, &QCheckBox::stateChanged, [this](int state){
      state ? m_timer.start() : m_timer.stop();
    });
    

    这样你就不需要参考ui->alarm

    QCheckBox::stateChanged(int state) 中,state 真的是一个

    枚举 Qt::CheckState

    Qt::Unchecked = 0 该项目未选中。

    Qt::PartiallyChecked = 1 项目被部分检查。如果检查了部分而非全部子项,则分层模型中的项可能会被部分检查。

    Qt::Checked = 2 项目被选中。

    【讨论】:

    • 太棒了!我明天会测试它,但我想它会工作得很好:)
    • 正确的测试是:if (state == Qt::Unchecked) m_timer.stop(); else if (state == Qt::Checked) m_timer.start();。你应该忽略PartiallyChecked 状态!
    • 还有一件事:您可以使用信号切换(布尔检查)而不是 stateChanged(int state)
    猜你喜欢
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    相关资源
    最近更新 更多