QTimer超时后如何调用多个函数?

How to call multiple functions when QTimer expires?

我希望能够在计时器超时时调用多个函数/方法,而无需创建调用所需方法的新插槽方法(参见代码)。

int foo;
int bar;

// …

private slots:
    inline void foo_func() { /*…*/ }
    inline void bar_func() { /*…*/ }
    inline void combination_of_multiple_func()
    {
        foo_func();
        bar_func();
    }

// …


// somewhere in a method:
if (foo == bar)
{
    // Schedule … every foo or bar milliseconds
    QTimer *timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(combination_of_multiple_func()));
    timer->start(foo);
}
else
{
    // Schedule … every foo milliseconds
    QTimer *fooTimer = new QTimer(this);
    connect(fooTimer, SIGNAL(timeout()), this, SLOT(foo_func()));
    fooTimer->start(foo);

    // Schedule … every bar milliseconds
    QTimer *barTimer = new QTimer(this);
    connect(barTimer, SIGNAL(timeout()), this, SLOT(bar_func()));
    barTimer->start(bar);
}

有更好的解决方案吗?

首先,您应该尽可能使用 Qt 的新信号和槽语法。

我可以想到两种方法来解决这个问题:

使用 lambda

if (foo == bar)
{
    // Schedule … every foo or bar milliseconds
    QTimer *timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, [] { foo_func(); bar_func(); } );
    timer->start(foo);
}

忽略它

每次只做2个定时器。开销可能不足以真正关心。

我的方法是根据需要建立尽可能多的连接,例如而不是:

connect(timer, SIGNAL(timeout()), this, SLOT(combination_of_multiple_func()));

将信号连接到两个插槽:

connect(timer, &QTimer::timeout, this, &WhateverThisIs::foo_func);
connect(timer, &QTimer::timeout, this, &WhateverThisIs::bar_func);