c++ - 有什么方法可以识别调用了哪个 QTimer?

标签 c++ qt

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

读完 QTimer docs 后我想到的另一件事正在保存 timerID 并检查它,但由于回调中没有任何内容,我不知道要检查什么:/

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

最佳答案

我可以想到至少两种您可以采用的方法:

首先,您可以通过在插槽中转换发送者来检索指向 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
    }
}

第二种方法在 documentation 中提到对于 QTimer:

Alternatives to QTimer

An alternative to using QTimer is to call QObject::startTimer() for your object and reimplement the QObject::timerEvent() event handler in your class (which must inherit QObject). The disadvantage is that timerEvent() does not support such high-level features as single-shot timers or signals.

关于c++ - 有什么方法可以识别调用了哪个 QTimer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48924190/

相关文章:

c++ - 指向 glutDisplayFunc 函数的指针

Qt 中使用样式表的类似 Android 的文本字段

c++ - 如何全屏 QGLWidget?

c++ - QT,我制作了无模态对话框,现在我想通过单击按钮关闭所有对话框

c++ - #include .h 或 .cpp 文件?

c++ - std::chrono::from_stream 正确用法

c++ - 访问 OpenCV 中的每个单独 channel

c++ - 如果指针指向无效内存,Visual Studio 会触发一个断点

qt - QProcess::startDetached被UAC阻止(运行更新程序)

qt - 在 Ubuntu 18.04.1 LTS 中安装 Qt 4.8.7