Qmap中的Qtimer对象发送的超时信号是从哪个key发出来的?
How can I find from which key the timeout signal sent from Qtimer objects in Qmap comes from?
在一个函数中,如何理解我在Qmap中创建的Qtimer对象发送的信号,如何在slot函数中查找信号来自哪个对象。
我在上面的代码中创建了 Qmap
SQL.h
public slots:
void experiment();
void run();
private:
QMap<QString,QTimer*> job;
我使用 Qtimer 创建 QMap 值和键。
SQL.cpp
void SQL::experiment()
{
QTimer *timer=new Qtimer();
job.insert("dd",timer);
QTimer *timer1=new Qtimer();
job.insert("ss",timer1);
job.value("dd")->start();
job.value("dd")->setInterval)(5000);
job.value("ss")->start();
job.value("ss")->setInterval)(10000);
connect(job.value("dd"),SIGNAL(timeout()),this,SLOT(run()));
connect(job.value("ss"),SIGNAL(timeout()),this,SLOT(run()));
}
在这个slot中,如何理解Qmap中的哪个Qtimer在那个时候收到了信号?
void SQL::run()
{
//job.value(key) // how to understand key
}
我想我可以将 sender() 与 Qmapiterator 一起使用,但我不知道如何使用。你能帮忙吗?
旧方法是使用 QSignalMapper
。您还可以将密钥设置为定时器对象的动态 属性,这样您就可以通过 QObject::sender()
访问它。但是,今天你应该只使用 lambda。
首先,更改 运行 插槽以获取您想要的任何参数:
void SQL::run(const QString &key)
{
QTimer *timer = job.value(key);
}
然后,只需使用lambda即可轻松传递所需参数
QString name="ff";
connect(job.value(name), &QTimer::timeout, this, [this, name]() {
run(name);
});
// name is capture by value above,
// so changing name variable later does not
// affect the value captured by the lambda
附带说明一下,您不应使用旧的 SIGNAL()
和 SLOT()
宏,除非出于某种原因确实需要这样做。使用“新”(10 岁)连接语法。
在一个函数中,如何理解我在Qmap中创建的Qtimer对象发送的信号,如何在slot函数中查找信号来自哪个对象。
我在上面的代码中创建了 Qmap SQL.h
public slots:
void experiment();
void run();
private:
QMap<QString,QTimer*> job;
我使用 Qtimer 创建 QMap 值和键。 SQL.cpp
void SQL::experiment()
{
QTimer *timer=new Qtimer();
job.insert("dd",timer);
QTimer *timer1=new Qtimer();
job.insert("ss",timer1);
job.value("dd")->start();
job.value("dd")->setInterval)(5000);
job.value("ss")->start();
job.value("ss")->setInterval)(10000);
connect(job.value("dd"),SIGNAL(timeout()),this,SLOT(run()));
connect(job.value("ss"),SIGNAL(timeout()),this,SLOT(run()));
}
在这个slot中,如何理解Qmap中的哪个Qtimer在那个时候收到了信号?
void SQL::run()
{
//job.value(key) // how to understand key
}
我想我可以将 sender() 与 Qmapiterator 一起使用,但我不知道如何使用。你能帮忙吗?
旧方法是使用 QSignalMapper
。您还可以将密钥设置为定时器对象的动态 属性,这样您就可以通过 QObject::sender()
访问它。但是,今天你应该只使用 lambda。
首先,更改 运行 插槽以获取您想要的任何参数:
void SQL::run(const QString &key)
{
QTimer *timer = job.value(key);
}
然后,只需使用lambda即可轻松传递所需参数
QString name="ff";
connect(job.value(name), &QTimer::timeout, this, [this, name]() {
run(name);
});
// name is capture by value above,
// so changing name variable later does not
// affect the value captured by the lambda
附带说明一下,您不应使用旧的 SIGNAL()
和 SLOT()
宏,除非出于某种原因确实需要这样做。使用“新”(10 岁)连接语法。