问题:
我有一个函数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
?
答案 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()
访问该实例,将其转换为您的类型并执行任何需要完成的操作。