首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何找到Qmap中Qtimer对象发送的超时信号来自哪个键?

问如何找到Qmap中Qtimer对象发送的超时信号来自哪个键?
EN

Stack Overflow用户
提问于 2022-04-21 06:13:10
回答 1查看 68关注 0票数 0

在函数中,如何理解我在Qmap中创建的Qtimer对象发送的信号,如何在插槽函数中找到信号来自哪个对象。

我在代码SQL.h上面创建了Qmap

代码语言:javascript
复制
public slots:
 void experiment();
 void run();
private:
 QMap<QString,QTimer*> job;

我用Qtimer创建了QMap值和键。SQL.cpp

代码语言:javascript
复制
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()));

}

在这个时隙中,我如何理解Qmap中的哪个Qtimer在当时接收信号?

代码语言:javascript
复制
void SQL::run()
{
  //job.value(key)  // how to understand key

}

我以为我可以在Qmapiterator中使用发送者(),但我无法找到方法。你能帮忙吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-21 06:54:41

旧的方法是使用QSignalMapper。您还可以将键设置为timer对象的动态属性,这样您就可以通过QObject::sender()访问它。但是,今天你可能应该用一只羔羊。

首先,更改运行槽以接受所需的任何参数:

代码语言:javascript
复制
void SQL::run(const QString &key)
{
    QTimer *timer = job.value(key);
}

然后,只需使用lambda轻松地传递所需的参数。

代码语言:javascript
复制
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年前)连接语法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71949711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档