有什么方法可以识别调用哪个QTimer?

时间:2018-02-22 09:47:41

标签: c++ qt

我考虑过为回调提供额外的参数,但看起来太复杂了(创建一个自己修改的QTimer对象等)。

通过QTimer docs阅读后我想到的另一件事是保存了timerID并检查了但由于回调中没有任何内容我不知道要检查什么:/

如果有人对特殊用例感兴趣: https://github.com/Bluscream/pyTSon_plugins/blob/master/scripts/antiAFK/init.py#L35

1 个答案:

答案 0 :(得分:3)

我可以想到你可以采取的至少两种方法:

首先,您可以通过在插槽中转发发件人来检索指向QTimer的指针:

class MyClass : public QObject
{
    Q_OBJECT
public:
    MyClass(QObject * parent = 0);
    <...>
private Q_SLOTS:
    void onTimerFired();
private:
    void doSomethingAndStartTimer();
private:
    int m_firstTimerId;
    int m_secondTimerId;
};

void MyClass::doSomethingAndStartTimer()
{
    <...>
    QTimer *timer = new QTimer(this);
    m_firstTimerId = timer->timerId();
    connect(timer, SIGNAL(timeout()), this, SLOT(onTimerFired()));
    timer->start();
    <..>
}

void MyClass::onTimerFired()
{
    QTimer * timer = qobject_cast<QTimer*>(sender());
    if (timer) {
        if (timer->timerId() == m_firstTimerId) {
            <...> // Process it somehow
        }
        else if (timer->timerId() == m_secondTimerId) {
            <...> // Process it some other way
        }
    }
}

其次,您可以放弃明确的QTimer用法,而是使用startTimer并重新实现您的类timerEvent方法,该方法可以从QTimerEvent获取计时器ID

class MyClass : public QObject
{
    Q_OBJECT
public:
    MyClass(QObject * parent = 0);
    <...>
private:
    virtual void timerEvent(QTimerEvent * event);
private:
    void doSomethingAndStartTimer();
private:
    int m_firstTimerId;
    int m_secondTimerId;
};

void MyClass::doSomethingAndStartTimer()
{
    <...>
    int interval = 100; // 100 msec
    m_firstTimerId = startTimer(interval);
    <...>
}

void MyClass::timerEvent(QTimerEvent * event)
{
    if (event->timerId() == m_firstTimerId) {
        <...> // process it somehow
    }
    else if (event->timerId() == m_secondTimerId) {
        <...> // process it some other way
    }
}

QTimer {{1}}中提到了第二种方法:

  

QTimer的替代品

     

使用QTimer的另一种方法是为对象调用QObject :: startTimer()并重新实现类中的QObject :: timerEvent()事件处理程序(必须继承QObject)。缺点是timerEvent()不支持单次定时器或信号等高级功能。

相关问题