提问人:bbbbbbbbb9 提问时间:5/4/2021 最后编辑:drescherjmbbbbbbbbb9 更新时间:5/4/2021 访问量:1434
QTimer::singleShot 不调用我的超时槽
QTimer::singleShot not calling my timeout slot
问:
我在按钮按下回调中调用 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
}
答:
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,重构代码不使用参数
评论
SLOT(on_snoozeTimeout(selectedData))
是不正确的。你不能像这样绑定成员变量。它需要,但 QTimer 不会在超时期间发送此值: https://doc.qt.io/qt-5/qtimer.html#timeout 您可能需要一个 lambda 表达式。SLOT(on_snoozeTimeout(Data))
selectedData