【问题标题】:QTimer in a template class模板类中的 QTimer
【发布时间】:2015-10-27 08:16:33
【问题描述】:

我有一个模板类,在我的例子中是一个状态机类,所以我可以用我的任何类类型构造它,这样它就可以使用带有指向成员函数的指针的函数表调用成员函数(种类就像一个回调)。

它通过在表中查找事件(状态和事件匹配)然后调用指向相应函数的指针来处理事件。

这一切正常。我接下来要做的是添加一个计时器,以便在计时器到期时调用带有事件代码“TIMER_EXPIRED”的 processEvent() 函数。

对我来说,问题是在 Qt 模板类中似乎不支持插槽/信号。所以,我可以添加一个 QTimer,但我无法连接它或定义/发出插槽/信号。

我的替代方法是在拥有状态机的类中实现计时器,这很好,但是我必须对所有使用状态机类的类执行此操作。

所以我不确定下一步该往哪个方向发展,有什么技巧可以用来解决这个问题吗?

我会添加示例代码,但是由于我无法在状态机类中实现 QTimer,因为我无法继承 QObject,所以还没有代码可以显示:(

【问题讨论】:

  • 您可以使用 lambdas 代替插槽。
  • @SaZ,我不是 100% 了解 lambda 函数,但我仍然看不到它们如何帮助我在课堂上实现 QTimer,你能解释一下你的意思吗?

标签: c++ qt qtimer


【解决方案1】:

Lambda 可以这样使用:

#pragma once

#include <QDebug>
#include <QTimer>

template< class T > class MyClass
{
public:
    MyClass()
    {
        _timer.setInterval(1000);
        // connecting the signal to the lambda
        // that will call the desired function:
        QObject::connect(&_timer, &QTimer::timeout,
                &_timer, [&](){
            theFunctionThatNeedToBeRunOnTimer();
        });
        _timer.start();
    }

    void theFunctionThatNeedToBeRunOnTimer()
    {
        qDebug() << "Timer ticked!";
    }

private:
    QTimer _timer;
};

【讨论】:

  • 谢谢这似乎工作(编译),但我不太明白!,lambda如何转换为“插槽”类型的函数?谢谢:)
  • @code_fodder,它没有,connect 的这种语法是专门为将信号绑定到 lambda 或仿函数的情况引入的。注意第三个参数,它用作 lambda 的上下文。如果作为第三个参数传递的对象被销毁,则不会发出信号。更多信息here.
  • 啊,我明白了,非常感谢 : ) .. 所以理论上你可以只用一个仿函数(不一定是 lambda?
  • @code_fodder,是的,你也可以使用仿函数,但是使用 lambda 更简洁。
  • @code_fodder connectstd::bind(&amp;Class::method, object)。在这种情况下,connect(&amp;_timer, &amp;QTimer::timeout, std::bind(&amp;MyClass::theFunctionThatNeedToBeRunOnTimer, this))。别忘了#include &lt;functional&gt;
猜你喜欢
  • 2010-11-08
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多