【问题标题】:Connect QTimer with a Slot with parameters [duplicate]将 QTimer 与带有参数的插槽连接 [重复]
【发布时间】:2022-07-21 23:14:28
【问题描述】:

我尝试了以下方法:

connext(&timer, &QTimer::timeout, this, &myClass::myMethod(_param1, _param2)); // does not work
timer.setSingleShot(true);
timer.start(100);

QTimer 类型的定时器是该类的成员元素。

有没有办法将定时器的 timeout() 信号连接到具有多个参数的方法?

【问题讨论】:

  • 使用 lambda 函数作为插槽。
  • 使用 lambda 并传递您需要的参数。
  • @ixSci 谢谢!以这种方式使用 lambda 时是否有任何缺点或需要考虑的事项?
  • 不,这是一个完全有效的用法。

标签: c++ qt qt5 qtimer


【解决方案1】:

QTimer 的超时信号 void timeout() 本身 - 没有足够的参数来调用 myClass::myMethod(_param1, _param2);(超时究竟应该从哪里获取 _param1_param2 ?)

您可以使用 lambda 函数:

//assuming you have _param1 & _param2 as variables before this point
connect(&timer, &QTimer::timeout, this, [=]() { myMethod(_param1, _param2); });
timer.setSingleShot(true);
timer.start(100);

需要注意的一点是,通过使用this 作为connect() 的接收对象,您可以将连接的生命周期与计时器的生命周期和当前对象 (this) 的生命周期联系起来,这应该确保如果两个对象之一死亡并且在 this 被释放后未执行 lambda(隐式调用 this->myMethod()),则连接将被正确销毁。

或者你可以在你的类中创建一个void myClass::handleTimeout() 函数,将时间的超时连接到它作为槽并那里调用myMethod(_param1, _param2)

void myClass::handleTimeout()
{
    //assuming _param1 & _param2 are variables accessible in handleTimeout()
    myMethod(_param1, _param2));
}

//Your original function...
void myClass::someFunction()
{
    //...
    connect(&timer, &QTimer::timeout, this, &myClass::handleTimeout);
    timer.setSingleShot(true);
    timer.start(100);
    //...
}

【讨论】:

    猜你喜欢
    • 2012-01-08
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 2021-11-14
    • 2020-04-27
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多