【问题标题】:QTimer activeChanged signalQTimer activeChanged 信号
【发布时间】:2017-11-07 01:14:33
【问题描述】:

QTimer 的文档中有一个 Properties-部分,其中包含 active-property。 这让我相信,我可以连接到类似activeChanged-signal 的东西。

恕我直言,原因不明

QObject::connect(m_timer, &QTimer::activeChanged, this, &MyObject::mySlot);

失败,说明activeChanged 不是QTimer 的成员。

基本上,我想做一些事情,当计时器最初启动(所以不是重新启动)或最终停止时。当信号activeChanged不存在时,有谁知道:

  • 为什么它是一个属性?
  • 如果还有其他信号要连接,要这样做吗?
  • 有什么方法可以在计时器启动或停止时挂接并执行某些操作?

在 main.cpp 中测试

QTimer* tim = new QTimer;
QObject::connect(tim, &QTimer::activeChanged, qApp, [tim](){qDebug() << "Active changed" << tim->isActive(); });
tim->start(40000); // I want to get a signal
tim->start(100);   // I don't want to get a signal
tim->stop();       // I want to get a signal

【问题讨论】:

  • 查看实现,原因很明显:Q_PROPERTY(bool active READ isActive) - 现在还有其他信号要连接也很明显。所以我有一个问题:如果没有这些信号,我如何实现我的目标?

标签: qt qt5 qtimer


【解决方案1】:

创建自己的定时器类并封装QTimer:

class Timer : public QObject
{
    Q_OBJECT
    QTimer m_timer;

public:
    Timer () 
    {
        connect(&m_timer, &QTimer::timeout, this, &Timer::timeout);
    }
    void start(int msec)
    {
        if (m_timer.isActive())
        {
            // Restart detected -> block signal
            m_timer.blockSignals(true);
            m_timer.start(msec);
            m_timer.blockSignals(false);
        }
        else
        {
            m_timer.start(msec);
        }
    }
}

由于Timer 类拥有QTimer 的完全控制权和知识,因此您可以拥有任何您想要的明显行为。

【讨论】:

  • 是的,当然。封装。我尝试了继承,因此失败了:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多