QTimer::singleShot 不调用我的超时槽

QTimer::singleShot not calling my timeout slot

提问人:bbbbbbbbb9 提问时间:5/4/2021 最后编辑:drescherjmbbbbbbbbb9 更新时间:5/4/2021 访问量:1434

问:

我在按钮按下回调中调用 singleshot,但我的超时槽从未被调用,在调试器中,我的代码到达我调用 singleshot 函数的位置,但它永远不会到达超时函数中的断点。

在 .h 中:

private slots:

void on_snoozeTimeout(Data d);

在.cpp中:

void MyClass::on_snoozeBtn_clicked()
{                   
   QTimer::singleShot(snoozeTimeoutValue*1000,this,SLOT(on_snoozeTimeout(selectedData)));
}
void MyClass::on_snoozeTimeout(Data d)
{
//not hitting this breakpoint
}
C++ Qt 定时器 QT4.8

评论

1赞 drescherjm 5/4/2021
SLOT(on_snoozeTimeout(selectedData))是不正确的。你不能像这样绑定成员变量。它需要,但 QTimer 不会在超时期间发送此值: https://doc.qt.io/qt-5/qtimer.html#timeout 您可能需要一个 lambda 表达式。SLOT(on_snoozeTimeout(Data))
0赞 bbbbbbbbb9 5/4/2021
@drescherjm所以我无法将参数传递到插槽中?
0赞 drescherjm 5/4/2021
不是你想要的方式。如果您有 Qt5 或更高版本,像当前答案这样的 lambda 可以解决这个问题。
0赞 bbbbbbbbb9 5/4/2021
我正在使用qt 4.8
0赞 drescherjm 5/4/2021
lambda 不能与 Qt-4.8 一起使用。解决方案将更加困难。您可能必须描述变量的来源,以便有人提出替代方案。selectedData

答:

1赞 JarMan 5/4/2021 #1

宏不能以您尝试使用它的方式接受函数参数。请改用 lambda:SLOT

QTimer::singleShot(snoozeTimeoutValue*1000, [this, selectedData](){
    on_snoozeTimeout(selectedData);
});

评论

0赞 bbbbbbbbb9 5/4/2021
我收到此错误:“selectedData”未捕获 on_snoozeTimeout(selectedData);^~~~~~~~~~~~~~~~~~
0赞 JarMan 5/4/2021
好吧,您的示例代码没有解释它来自哪里。将其添加到 lambda 捕获中。我会进行编辑。
0赞 bbbbbbbbb9 5/4/2021
错误:在“}”标记之前预期为“)”} ^
0赞 JarMan 5/4/2021
我错过了闭幕式。
0赞 bbbbbbbbb9 5/4/2021
此 lambda 函数未捕获“this”
0赞 bbbbbbbbb9 5/4/2021 #2

使用 qt4.8,重构代码不使用参数