Qt:定期调用带参数的函数

时间:2018-03-22 15:39:09

标签: c++ qt

问题: 我有一个函数void myFunc(data)

我正在使用QSqlQuery从数据库中读取数据:

QSqlQuery qry;
if (qry.exec("SELECT data, interval from table"))
{
   while(qry.next())
   {
       // Somehow create and call function: myFunc(int data) periodically with interval = interval
   }
}

据我了解,我可以使用这样的计时器:

QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(myFunc()));
timer->start(interval); //time specified in ms

但是在创建此计时器时如何将参数data传递给myFunc

4 个答案:

答案 0 :(得分:5)

如果使用C ++ 11,则可以将计时器连接到lambda函数,在该函数中捕获数据值。

示例(未经测试):

int interval = 500;
int data = 42;

QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout, [data] {
    /* Implement your logic here */
});

答案 1 :(得分:2)

还有一个选项:有一个QObject派生类,它运行调用QObject::startTimer的函数。在同一个类中,使用QMap<int, int>,其中每对都有定时器ID作为键,数据作为值。

一个简单的实现:

#include <QObject>
#include <QMap>

class TimedExecution : QObject
{
    Q_OBJECT
public:
    TimedExecution() : QObject(0){}
    void addFunction(int data, int interval);
protected:
    void timerEvent(QTimerEvent *event);
private:
    QMap<int, int> map;
};

使用addFunction方法创建一个新的定时执行任务(假设传递的间隔以秒表示,这里):

void TimedExecution::addFunction(int data, int interval)
{
    map.insert(startTimer(interval * 1000), data);
}

在重写的timerEvent方法中启动相同的函数,使用从timer事件中检索的计时器ID作为映射键,传递从映射中检索的数据:

void TimedExecution::timerEvent(QTimerEvent *event)
{
    myFunc( map[event->timerId()] );
}

答案 2 :(得分:1)

如果您可以使用Qt5和C ++ 11,那么您可以利用std::bind

例如,假设为decltype(this)==MyClass*

connect(timer, &QTimer::timeout, this, std::bind(&MyClass::myFunc,this,data));

答案 3 :(得分:0)

您有很多选择:

  • 正如评论中所提到的那样,将数据存储在this中,可能在std::map<QTimer*, int>中,这样当您有多个计时器时,您可以查找正确的值并使用它来调用myFunc。由于您尚未声明myFunc是一个函数还是多个函数,您可能还必须存储该函数
  • 您可以创建一个在构造函数中获取data值的类,将其保存在成员中,将该类的插槽连接到计时器,然后从插槽中调用myFunc()储值
  • 您可以创建一个继承自QTimer的类并拥有您需要的数据,在创建计时器而不是普通QTimer时使用该类,然后在插槽myFunc中使用您可以通过QObject::sender()访问该实例,将其转换为您的类型并执行任何需要完成的操作。