C++/Qt中如何中断函数执行?教程模式旋转停止需求
解决方案
你当前通过循环创建大量QTimer::singleShot的方案存在核心问题:这些单次定时器一旦被Qt事件循环调度,就无法批量取消,只能逐个追踪并停止,操作繁琐且低效。更合理的做法是使用重复QTimer来实现可控的平滑旋转,同时支持随时中断。
实现步骤
- 添加定时器成员变量
在myWidget类的头文件中声明定时器和角度记录变量:
class myWidget : public QWidget { Q_OBJECT private: QTimer* m_rotationTimer; float m_rotationAngle = 0.0f; // 记录当前旋转角度 // ... 其他成员 };
- 初始化定时器
在构造函数中完成定时器的初始化、间隔设置和信号槽连接:
myWidget::myWidget(QWidget* parent) : QWidget(parent) { m_rotationTimer = new QTimer(this); m_rotationTimer->setInterval(25); // 25ms触发一次 connect(m_rotationTimer, &QTimer::timeout, this, &myWidget::rotateCameraAutomatic); }
- 改写启动旋转逻辑
替换原有的rotateCamera函数,只需启动重复定时器即可:
void myWidget::rotateCamera() { m_rotationAngle = 0.0f; // 可选:重置角度从头开始旋转 m_rotationTimer->start(); }
- 实现旋转与视图刷新
在rotateCameraAutomatic中处理角度更新并触发GL视图刷新:
void myWidget::rotateCameraAutomatic() { m_rotationAngle += 5.0f; if (m_rotationAngle >= 360.0f) { m_rotationAngle -= 360.0f; // 避免角度数值无限增大 } // 更新GL相机旋转角度,调用视图刷新方法 updateGL(); // 根据你使用的GL组件调整刷新接口 }
- 添加停止旋转的触发逻辑
在停止按钮的点击槽函数中,直接停止定时器即可中断旋转:
void myWidget::on_stopTutorialBtn_clicked() { m_rotationTimer->stop(); }
方案优势
- 支持随时启停,无需追踪大量单次定时器
- 代码结构简洁,内存占用更低
- 旋转逻辑可灵活调整(比如中途修改旋转速度、角度增量)
额外注意事项
- 由于定时器设置了父对象为
this,Qt会自动管理其内存,无需手动在析构函数中删除 - 如果需要旋转到指定角度后自动停止,可在
rotateCameraAutomatic中判断角度达到目标值时调用m_rotationTimer->stop()
内容的提问来源于stack exchange,提问作者Garance
相关产品推荐
相关产品推荐

