如何在槽函数中停止QTimer?变量达标时停止的代码疑问
修正你的QTimer递增逻辑问题
嘿,我瞅了下你写的QTimer相关代码,发现了个核心逻辑问题,咱们来把它理顺:
你的代码里的问题点
- 你在
on_start_clicked()里启动定时器后立刻判断b == 98,这时候b刚被设为95,这个判断完全不会触发,等于白写了。 - 停止定时器的逻辑放错地方了:应该在每次变量递增后检查是否达标,也就是要移到
increase()槽函数里才行。
修正后的完整代码示例
首先要确保b是MainWindow的成员变量(不然槽函数没法持续访问它),然后调整逻辑位置:
// MainWindow类的头文件部分(声明成员) class MainWindow : public QMainWindow { Q_OBJECT private: QTimer *m_timer; int b; // 作为成员变量,保证跨函数访问 // ...其他你的类成员 }; // MainWindow构造函数里初始化定时器和信号连接 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { m_timer = new QTimer(this); // 旧的SIGNAL/SLOT宏也能用,但更推荐Qt5+的新语法(编译时检查错误) // connect(m_timer, SIGNAL(timeout()), this, SLOT(increase())); connect(m_timer, &QTimer::timeout, this, &MainWindow::increase); } void MainWindow::on_start_clicked() { b = 95; // 重置变量初始值 m_timer->start(1000); // 启动定时器,每秒触发一次timeout信号 } void MainWindow::increase() { b += 1; qDebug() << b; // 每次递增后检查是否达到目标值,达标就停止定时器 if (b == 98) { m_timer->stop(); qDebug() << "定时器已停止,变量达到目标值98"; } }
关键说明
- 成员变量的必要性:
b必须是类的成员变量,如果是on_start_clicked()里的局部变量,函数执行完就销毁了,increase()根本没法访问到它,更别说递增了。 - 逻辑位置修正:把停止定时器的判断放到
increase()里,每次定时器触发、变量更新后检查,这样当b从95逐步涨到98时,第三次触发increase()就会停止定时器,符合你的需求。 - 新信号槽语法推荐:Qt5及以上版本的新连接语法(
connect(m_timer, &QTimer::timeout, this, &MainWindow::increase))在编译阶段就能检查信号槽是否匹配,比旧的宏语法更安全,不容易出错。
内容的提问来源于stack exchange,提问作者carlos moya
相关产品推荐
相关产品推荐

